我正在编写一个Java类,它扩展了Ant Zip Task,为我做了一项特殊的工作。我想创建一个zip文件,一旦创建了该文件,我想要抑制inode中的访问时间,这样我就无法修改或找不到改变的方法,即使文件被修改了。原因是我做了一个md5哈希,它取决于访问时间。因此,这给我带来了很多麻烦,并且使访问时间不变将解决我的问题。 现在有人如何实现这一目标? 谢谢!
答案 0 :(得分:1)
我以前必须解决类似的问题 - 也许这是你的选择。就我而言,问题是:
我们制作了一个jar文件,然后在jar文件上运行了一个安全的哈希算法。因为jar文件实际上是一个zip文件,而zip文件内部包含文件元数据信息,包括上次访问时间,如果我们从完全相同的源材料创建一个新的jar文件,那么新的jar文件与原始哈希值不匹配(因为虽然zip内容相同,但zip文件中存储的元数据具有不同的文件创建/访问时间。)
基本上,我们需要能够为合规性目的计算安全哈希,以便能够轻松地显示jar的内容未更改。重新编译一个等效的jar是可以的 - 只是内容必须是相同的。
我们编写了一组简单的工具,专门为zip / 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();
但请注意,某些文件(如清单)可能包含诸如用于创建jar的ant版本以及用于编译类的编译器版本等信息。因此,您必须从等效环境中编译以匹配哈希。
最后,这并不能解决zip文件本身可能包含其他zip文件的事实。虽然它足够直接使检查能够满足这一需求并下降到嵌套的zip / jar / war文件中,但我们的实现却没有。