2011-09-25 17 views
5

質問は簡単です:JavaクラスMessageDigestでいつreset()関数を呼び出す必要がありますか?MessageDigest.reset()を使用する前にそれを呼び出す必要がありますか?

質問は主にコードサンプルでは、​​彼らはOWASP reference、から来ている:

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

私はあなたが正しいと思います、初期reset()は必要ありません。 The documentation states

MessageDigestオブジェクトが初期化されます。

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

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

複数のスレッドから同一のMessageDigestオブジェクトを同期させずに使用しないでください。ハッシュは、部品がハッシュされた順番がわかっている場合にのみ意味があります。そうでない場合は完全に確定的なPRNGです。

+0

TY、意味があります。 Googleの検索エンジンで多くのことを見ていて、クラスヘッダーとgetInstance()docを再読み込みするのを忘れてしまったので、混乱しました。 –

関連する問題