2

我正在编写一个 Java 类,它扩展了 Ant Zip Task 来为我完成一项特定的工作。我想创建一个 zip 文件,一旦创建了该文件,我想抑制 inode 中的访问时间,因此即使文件被修改,我也不能被修改或找到不让它改变的方法。原因是我做了一个 md5 哈希,这取决于访问时间。因此,这给我带来了很多麻烦,并且使访问时间恒定将解决我的问题。有人现在我将如何做到这一点?谢谢!

4

1 回答 1

1

我以前必须解决类似的问题-也许这是您的选择。就我而言,问题是:

我们制作了一个 jar 文件,然后在该 jar 文件上运行了一个安全的哈希算法。因为 jar 文件实际上是一个 zip 文件,并且 zip 文件内部包含文件元数据信息,包括上次访问时间,如果我们从完全相同的源材料创建一个新 jar 文件,那么新 jar 文件上的哈希不匹配原始哈希(因为虽然 zip 内容相同,但 zip 文件中存储的元数据具有不同的文件创建/访问时间)。

基本上,为了合规目的,我们需要能够计算安全哈希,以便能够轻松地显示 jar 的内容未更改。重新编译一个等效的 jar 是可以的 - 只是内容必须相同。

我们编写了一组简单的工具,专门为 zip/jar 文件执行安全哈希(和验证)。它计算了两个哈希:

  • 文件的常规安全哈希(它将识别完全相同的 jar - 这与标准 md5sum 的输出相同)
  • 通过迭代 zip/jar 的解压缩内容的字节计算的“仅内容”哈希(因此可用于识别重新编译的 jar 与原始 jar 匹配)

为了实现仅内容散列,我们使用 aZipInputStream来遍历 zip 条目。

MessageDigest sha1;
byte[] digest;

for (each zip file entry)
{
  if (entry represents a directory)
  {
    sha1.update( directory name bytes as UTF-8 );
  }
  else
  {
    read the entry bytes using ZipInputStream.read()
    sha1.update( bytes );
  }
}

digest = sha1.digest(); 

也可以看看:ZipInputStream.read()

但是请注意,某些文件(例如清单)可能包含诸如用于创建 jar 的 ant 版本以及用于编译类的编译器版本等信息。因此,您必须从等效环境编译以使哈希匹配。

最后,这无法解决 zip 文件本身可能包含其他 zip 文件的事实。虽然这足以让检查满足这一点并下降到嵌套的 zip/jar/war 文件中,但我们的实现却没有。

于 2012-06-05T22:45:05.803 回答