Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 禁止或不允许修改访问时间_Java_File_Ant_Md5_File Access - Fatal编程技术网

Java 禁止或不允许修改访问时间

Java 禁止或不允许修改访问时间,java,file,ant,md5,file-access,Java,File,Ant,Md5,File Access,我正在编写一个Java类,它扩展Ant-Zip任务来为我完成特定的工作。我想创建一个zip文件,一旦创建了该文件,我想抑制inode中的访问时间,这样我就不能被修改,或者找到一种不让它改变的方法,即使文件被修改了。原因是我做了一个md5散列,它取决于访问时间。因此,这给了我很多麻烦,使访问时间恒定将解决我的问题。 有人知道我该如何做到这一点吗? 谢谢 我以前也曾解决过类似的问题-也许这是您的一个选择。就我而言,问题是: 我们制作了一个jar文件,然后在jar文件上运行了一个安全的哈希算法。因为j

我正在编写一个Java类,它扩展Ant-Zip任务来为我完成特定的工作。我想创建一个zip文件,一旦创建了该文件,我想抑制inode中的访问时间,这样我就不能被修改,或者找到一种不让它改变的方法,即使文件被修改了。原因是我做了一个md5散列,它取决于访问时间。因此,这给了我很多麻烦,使访问时间恒定将解决我的问题。 有人知道我该如何做到这一点吗?
谢谢

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

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

基本上,我们需要能够出于法规遵从性的目的计算安全散列,以便能够轻松地显示jar的内容是不变的。重新编译一个等效的jar是可以的——只是内容必须相同

我们编写了一组简单的工具,专门针对zip/jar文件执行安全哈希(和验证)

  • 文件的常规安全散列(将标识完全相同的jar-这将与标准md5sum的输出相同)
  • “仅内容”散列,通过迭代zip/jar的未打包内容的字节来计算(因此可用于识别重新编译的jar是否与原始jar匹配)
为了实现只包含内容的散列,我们使用了一个函数来迭代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文件中,但我们的实现没有。为什么不从MD5哈希中排除访问时间?通常,MD5哈希仅基于上下文nt,不是关于文件属性的。不幸的是,我的情况就是这样。确定下一个问题:你说“即使文件被修改也不要更改”。因此,如果文件被修改,MD5哈希不会因为内容的更改而更改?它只会因为访问时间的更改而更改?是的,但是如果我修改文件并创建一个zip文件其中,md5创建的哈希将不同,我将使用该哈希来确定文件是否在存储库中。这是一个准确的总结:您创建了一个zip文件,然后在zip文件上运行md5哈希。因为zip文件内部包含文件元数据信息,包括上次访问时间,如果您创建一个新的zip文件从完全相同的源材料中,新zip文件上的MD5哈希将与原始MD5哈希不匹配(因为虽然zip内容相同,但存储在zip文件中的元数据具有不同的访问时间).这正是我想要的。你能告诉我更多的细节吗?你是怎么做到的?@philippe:我不能给你代码,但我已经展示了上面的方法-它并不太复杂。这就足够了!非常感谢!