5

Java でのハッシュ生成に関する OWASP の推奨事項にやみくもに従ってきました (こちらを参照)。具体的には、 の目的と効果がよくわからないMessageDigest.reset()ため、いつ、どのように使用すればよいかわかりません。

  1. update()完全に署名する必要があるさまざまな値を使用してダイジェストを数回 ing することにより、salt とペイロードを「ロード」しています。reset()事前に消化する必要がありますか?それともその後?
  2. ダイジェストがreset()ループ内にあるのはなぜですか (例を参照)。

これが私のコードです:

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(salt);
md.update(payload1);  // part 1 of payload
md.update(payload2);  // part 2 of payload
md.update(serialNumber);  // part 3 of payload
md.reset();
byte[] sig = md.digest();
for (int i=0; i<1000; i++) {
  md.reset();
  sig = md.digest(sig);
}

私が観察しているのは、serialNumberが変わっても署名が同じままであることです。「reset()」呼び出しを省略した場合、sig は変更されます...

4

2 に答える 2

9

resetのインスタンスをすでに使用している場合にのみ呼び出す必要がありますMessageDigestreset以前の設定をすべてクリアするために、ここで呼び出されています。

MessageDigest.getInstanceシングルトンではなくファクトリメソッドであるため、かなりのオーバーヘッドがかかります。

MessageDigest.getInstanceから:

指定されたアルゴリズムをサポートする最初のプロバイダーからの MessageDigestSpi 実装をカプセル化する新しいMessageDigest オブジェクトが返されます。

したがって、再利用して、MessageDigest.getInstance再度呼び出すオーバーヘッドを回避することをお勧めします。

于 2012-12-10T14:18:04.350 に答える
7

コードは私には見えません...多分私はここを読み間違えていますが、ドキュメントdigest()暗黙的にインスタンスをリセットすると言っています。したがって、reset()1)以前に呼び出されupdate()、2)インスタンスを再利用する必要があったが、呼び出しの結果が必要なかった場合は、update()呼び出します。

あなたの場合、私はあなたがへの最初の呼び出しを省く必要があると思いますreset()。そうでなければ、あなたは塩とペイロードからの利益を捨てています。ループ内への呼び出しreset()は不要ですが、計算結果を変更するべきではありません。

お役に立てば幸いです。

于 2012-12-10T15:22:50.090 に答える