2

特定の仕事をするためにAntZipタスクを拡張するJavaクラスを書いています。zipファイルを作成したいのですが、そのファイルを作成したら、iノードでのアクセス時間を抑制して、ファイルが変更されても変更できないようにしたり、変更させない方法を見つけたりしたいと思います。その理由は、アクセス時間に依存するmd5ハッシュを作成したためです。したがって、それは私に多くの問題を与えています、そしてアクセス時間を一定にすることは私の問題を解決するでしょう。誰かが今それをどのように達成しますか?ありがとう!

4

1 に答える 1

1

私は以前に同様の問題を解決しなければなりませんでした - おそらくこれはあなたのためのオプションです. 私の場合、問題は次のとおりでした。

jar ファイルを作成し、jar ファイルに対して安全なハッシュ アルゴリズムを実行しました。jar ファイルは実際には zip ファイルであり、zip ファイルには最終アクセス時刻を含むファイル メタデータ情報が内部的に含まれているため、まったく同じソース マテリアルから新しい jar ファイルを作成すると、新しい jar ファイルのハッシュは一致しません。元のハッシュ (zip の内容は同じですが、zip ファイルに格納されているメタデータはファイルの作成/アクセス時間が異なるため)。

基本的に、jar の内容が変更されていないことを簡単に示すことができるように、コンプライアンスの目的で安全なハッシュを計算できる必要がありました。同等の jar を再コンパイルしても問題ありませんでした。内容が同一である必要があるだけです。

zip/jar ファイル専用の安全なハッシュ (および検証) を実行する簡単なツール セットを作成しました。2 つのハッシュを計算しました。

  • ファイルの通常の安全なハッシュ (まったく同じ jarを識別します。これは、標準の md5sum の出力と同じになります)
  • zip/jar のアンパックされたコンテンツのバイトを反復することによって計算された「コンテンツのみ」のハッシュ (したがって、再コンパイルされた jar が元の jar と一致したことを識別するために使用できます)

コンテンツのみのハッシュを実装するために、a を使用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 ファイルに降りることは簡単ですが、私たちの実装はそうではありません。

于 2012-06-05T22:45:05.803 に答える