【问题标题】:suppressing or not allowing the access time to be modified java禁止或不允许修改访问时间java
【发布时间】:2012-06-05 20:15:23
【问题描述】:

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

【问题讨论】:

  • 为什么不从 MD5 哈希中排除访问时间?通常,MD5 哈希仅基于内容,而不基于文件属性。
  • 不幸的是,在我的情况下这是要走的路。
  • OK 下一个问题:你说,'不要改变,即使文件被修改了'。那么如果文件被修改了,MD5哈希不会因为内容的变化而变化吗?它只是因为访问时间的变化而变化?
  • 是的,但是如果我修改文件并从中创建一个 zip 文件,则 md5 创建的哈希值会有所不同,我将使用该哈希值来确定文件是否在存储库。
  • 这是一个准确的总结吗:您制作了一个 zip 文件,然后对 zip 文件运行 MD5 哈希。由于 zip 文件内部包含文件元数据信息,包括上次访问时间,如果您从完全相同的源材料创建一个新的 zip 文件,新 zip 文件上的 MD5 散列将与原始 MD5 不匹配hash(因为zip内容相同,但zip文件中存储的元数据访问时间不同)。

标签: java file ant md5 file-access


【解决方案1】:

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

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

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

我们编写了一组简单的工具,专门为 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 文件中,但我们的实现却没有。

【讨论】:

  • 这正是我正在寻找的。你能告诉我更多你是怎么做到的吗?
  • @philippe:我不能给你代码,但我已经展示了上面的方法 - 它并不是非常复杂。
  • 这就够了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多