3

Express.js フレームワークと暗号を使用して pbkdf2 でパスワードをハッシュする デフォルトのアルゴリズムは HMAC-SHA1 であると読みましたが、他のファミリまたは SHA のいずれかにアップグレードされていない理由がわかりません。

crypto.pbkdf2(password, salt, iterations, keylen, callback)

提供する keylen は、必要な SHA のバリエーションですか? SHA-256,512など?

また、HMAC はどのように出力を変更しますか?

最後に、SHA1 が壊れたときに十分な強度がありますか?

私が物事を混同していたらごめんなさい。

4

2 に答える 2

1

提供する keylen は、必要な SHA のバリエーションですか? SHA-256,512など?

特にパスワードをハッシュしていると述べているように、@CodesInChaos は正しいです。keylen (つまり、PBKDF2 からの出力の長さ) は、最大で HMAC のネイティブ ハッシュ関数のビット数になります。

  • SHA-1 の場合、160 ビット (20 バイト)
  • SHA-256 の場合、それは 256 ビット (32 バイト) などです。
  • この理由は、ハッシュ関数がサポートするよりも長いハッシュ (keylen) を要求した場合、最初のネイティブの長さが同じであるため、攻撃者はビットのみを攻撃する必要があるためです。これは、Hashcat チームが発見したときに 1Password が発見して修正した問題です。

証明としての例:

これは 22 バイト相当の PBKDF2-HMAC-SHA-1 です - これは 1 つのネイティブ ハッシュ サイズ + さらに 2 バイトです (合計 8​​192 回の反復が必要です! - 最初の 4096 回の反復で最初の 20 バイトが生成され、次にセットに対してさらに 4096 回の反復が行われますその後!):

  • pbkdf2 sha1「パスワード」「ソルト」4096 22
    • 4b007901b765489abead49d926f721d065a429c12e46

そして、ここでは PBKDF2-HMAC-SHA-1 の最初の 20 バイトを取得しています。つまり、正確に 1 つのネイティブ ハッシュ出力サイズです (合計 4096 回の反復が必要です)。

  • pbkdf2 sha1「パスワード」「ソルト」4096 20
    • 4b007901b765489abead49d926f721d065a429c1

22 バイトの PBKDF2-HMAC-SHA-1 を保存したとしても、攻撃者は 20 バイトを計算するだけで済みます...これは、バイト 21 と 22 を取得するのにかかる時間の約半分であり、HMAC 値の別のセット全体が計算され、その場合、2 バイトのみが保持されます。

  • はい、その通りです。PBKDF2-HMAC-SHA-1 の場合、21 バイトは 20 の 2 倍の時間を要し、40 バイトは実際には 21 バイトと同じくらいの時間がかかります。ただし、41 バイトは 20 バイトの 3 倍の長さが必要です。

また、HMAC はどのように出力を変更しますか?

HMAC RFC2104はハッシュ関数をキーイングする方法であり、特にキーとテキストを単純に連結する場合に弱点があるものです。HMAC-SHA-1 は、HMAC で使用される SHA-1 です。HMAC-SHA-512 は、HMAC で使用される SHA-512 です。

最後に、SHA1 が壊れたときに十分な強度がありますか?

十分な反復がある場合 (2014 年には数万回以上から数十万回以上)、問題はありません。特に PBKDF2-HMAC-SHA-512 には、現在の CPU (つまり、ほとんどの防御側) よりも現在のグラフィックス カード (つまり、多くの攻撃側) での動作がはるかに悪いという利点があります。

ゴールド スタンダードについては、 Is SHA-1 secure for password storage?で @ThomasPornin が提供した回答を参照してください。「MD4、MD5、および SHA-1 に対する既知の攻撃は衝突に関するものであり、プリイメージの耐性には影響しません。MD4 には、試みたときに (理論的にのみ) 悪用できるいくつかの弱点があることが示されています。 HMAC/MD4 を壊しますが、これはあなたの問題には当てはまりません.Kesley と Schneier による論文の 2106 秒のプリイメージ攻撃は、非常に長い入力 (260 バイト; 100 万テラバイト) にのみ適用される一般的なトレードオフです。 106+60 が 160 を超えていることに注意してください; ここで、トレードオフに魔法が何もないことがわかります)。

于 2014-02-07T05:09:24.783 に答える