5

質問は簡単です: Java クラス MessageDigest で reset() 関数を呼び出す必要があるのはいつですか?

質問は主にOWASP リファレンスから来ています。コードサンプルでは、​​次のようにしています。

   MessageDigest digest = MessageDigest.getInstance("SHA-1");
   digest.reset();
   digest.update(salt);
   byte[] input = digest.digest(password.getBytes("UTF-8"));

次に、ループで次のことを行います。

   for (int i = 0; i < iterationNb; i++) {
       digest.reset();
       input = digest.digest(input);
   }

今、私には、ダイジェストインスタンスが更新の呼び出しですでに「汚染」されている場合にのみ、リセットが必要であるように見えます。したがって、最初のサンプルのものは必要ないようです。必要な場合、MessageDigest.getInstance によって返されたインスタンスがスレッドセーフではないことを示していますか?

4

1 に答える 1

4

おっしゃる通りだと思いますが、イニシャルreset()は不要です。ドキュメントには次のように記載されています。

MessageDigest オブジェクトは初期化された状態で開始されます。

また、クラスのドキュメントの例には、初期リセットは含まれていません。

これはスレッドセーフとは関係ありません。必要性は、それが初期化自体を行わない.reset()ことを示しているだけです。getInstance()

とにかく、同期せずに複数のスレッドから同じ MessageDigest オブジェクトを使用しないでください。ハッシュは、パーツがハッシュされた順序を知っている場合にのみ意味があります。

于 2011-09-25T15:56:03.377 に答える