抑制或不允许修改访问时间java

时间:2012-06-05 20:15:23

标签: java file ant md5 file-access

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

1 个答案:

答案 0 :(得分:1)

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

  

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

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

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

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

为了实现仅内容哈希,我们使用ZipInputStream来迭代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文件中,但我们的实现却没有。