web-dev-qa-db-ja.com

パスワードハッシュのゴールドスタンダード

機密性の高い情報を処理するWebアプリケーションを開発しており、パスワードのハッシュがゴールドスタンダードであることを確認したいと考えています。理想的には、PBKDF2を使用してアルゴリズムの複数の反復を実行するユーザーごとのソルトSHA512を使用しますが、asp.netで開発しているため、PBKDF2の組み込み.net SHA512バージョンはありません-SHA1に制限されています(つまり、Rfc2898DeriveBytes)。

私の質問は本当に、私が.netで開発していて機密情報を保護していることを念頭に置いて、ユーザーのパスワードをハッシュする最良の方法は何ですか?

。netのSHA1 PBKDF2実装に固執する必要がありますか?
PBKDF2のカスタム実装を使用してSHA512を組み込む必要がありますか?
広く認定されている標準ではない(NISTなど)にもかかわらず、bcryptまたはscryptを使用すべきですか?

10
Drunk Goldfish

内蔵のRfc2898DeriveBytes、反復回数が多い場合-反復回数が多いほど良いですが、絶対最小値として5000をお勧めします。 SHA1は一部の用途では壊れていると見なされますが、PBKDF2での使用方法とは異なり、おそらく製品の寿命の範囲内にはありません。

SHA512で独自のPBKDF2を実装することは難しくありません。実際、 Microsoftはリファレンス実装を提供しています SHA256を使用しています。

9
Polynomial

BcryptはPBKDF2よりもわずかに「優れています」 。ただし、PBKDF2はすでに非常に優れています。適切に使用すると、システムの最も弱い点でなくなります。

PBKDF2の反復のポイントは、攻撃者に対してパスワードハッシュslowを作成することであることに注意してください。残念ながら、それはあなたにとっても遅くなります。したがって、過度に遅くなることを避ける必要があります。特に、SHA-512を検討してください。SHA-512は、多くの64ビット算術演算を使用します。攻撃者は64ビット操作が得意なPCを購入できます(最近のx86 CPUには64ビットモードがあり、古いプロセッサはSSE2オペコードを使用できます)。一方、サーバーはもう少し制限されている可能性があります。サーバーが32ビットモードで実行されている場合、SHA-512は非常に遅くなります(.NETを使用し、.NETではいじらないため) SSE2オペコード)、攻撃者に計算上の利点を与えます(約6倍)。

システム提供のPBKDF2実装を使用すると、そのような人為的なスローダウンが発生しない可能性が最大になります(特に、SHA-1のネイティブコード実装を使用できます)。 SHA-1の既知の欠点は、PBKDF2で使用してもセキュリティに影響を与えません。

「自分で」何かを行う場合は、これらのパフォーマンスの問題とその詳細を理解する必要があります。そして、何かがうまくいかない場合、あなたはおそらく非難を受けるでしょう。

10
Thomas Pornin

個人的には、BCryptを使用します。アルゴリズムはNISTにリストされていないかもしれませんが、私が信頼できるほど長い間(13年、そしてBlowfish暗号自体はほぼ20)あります。比較すると、MD5は導入後わずか5年で脆弱であることが示され、18年で完全に壊れたと見なされました。

20年間でBlowfish暗号に対する唯一の既知の攻撃は、既知の平文攻撃であり、指数関数的な既知の入力メッセージと結果の暗号文が必要です(2 ^ 8n + 1、nはFeistel暗号のラウンド数、標準ではキーを導出するための16ラウンドのフグ(2 ^ 129)。 BCryptの場合、これと同じ攻撃は実行不可能です。まず、BCryptに対して「有効」なプレーンテキストは1つだけです(ASCII string "OrpheanBeholderScryDoubt")。次に、他のプレーンテキストをフィードすることによってリバースエンジニアリングされるキーは、そもそもパスワードを難読化する、指数関数的に複雑な鍵導出関数の結果。Unixシステム用の1つのC実装に脆弱性があり、非ベースASCII文字を含むパスワードが与えられるとアルゴリズムが破損する;結果として、脆弱性のない新しいアルゴリズムは、BCryptバリアント "$ 2y $"で始まる必要があります(ほとんどの場合、あいまいな古い "$ 2a $"を使用していますが、ハッシュを生成したアルゴリズムは安全である可能性があります) 、しかし多分そうではない)。

さて、私はBCryptを好みますが、PBKDF2は前かがみになりません。 SHA-1は、複雑さが一定で比較的低いため脆弱であると考えられていますが、その攻撃を実行するのに十分なCPUをクラウドプロバイダーから貸与して単一のハッシュを破壊するための推定コストは、約2.77百万ドルになります。 PBKDF2では、SHA-1がHMACとして使用されます。つまり、SHA-1ハッシュは、派生関数の反復ごとに少なくとも2回実行されます。 5,000回の反復と320ビットのキーの長さ(派生キーの半分ごとに1つずつ、5,000回の反復の2つのセットが必要)では、1つのハッシュを破壊する際の脆弱性は、20をリバースエンジニアリングする必要があるという事実によって相殺されます。それらの数千(2 ^ 14.3のオーダーの複雑さを追加し、完全な攻撃を2 ^ 175のようなものにします)。

270万ドルのコストに1つをクラックするSHAハッシュに複雑さの増加を掛けると、PBKDF2ハッシュを「長い道のり」で壊すために約554億ドルの値札が付きます(何も知らない)。 そしてがあなたの秘密を望んでいるだろう より安い方法を見つける

6
KeithS

誰かのパスワードのセキュリティを気にする場合は、PBDKF2から離れ、leastからBCryptに移動する必要があります。ハードウェアのクラッキングに関する最先端の技術を見てください。

ハードウェアでのBCryptのクラッキングについては、 特別な目的のハードウェアを使用したbcryptパスワード検索の高速実装 を参照してください。

| Algorithm  | hashes/sec | hashes/sec/Watt |
|------------|------------|-----------------|
| BCrypt(12) |      410.4 |           20.52 |
| BCrypt(5)  |   51,437   |        2,572    |

カスタムASIC(the "Virtex-7")を作成します。これは、CPUよりも10倍高速です(ビデオカードよりも30倍高速です)。 )、どちらかの6%の電力を使用します。

それは、BCryptパスワードを解読する最先端の技術です。それをPBKDF2と比較してください。私は 50Mハッシュ/秒を計算する2.5W USBスティック を持っています。 1,000回の反復、5,000回の反復、さらにはiOS標準の10,000回の反復を試すことができます。

| Algorithm   | hashes/sec | hashes/sec/Watt |
|-------------|------------|-----------------|
| BCrypt(12)  |      410.4 |           20.52 |
| BCrypt(5)   |   51,437   |        2,572    |
| PBKDF2(10k) |   35,000   |       14,000    |
| PBKDF2(5k)  |   70,000   |       28,000    |
| PBKDF2(1k)  |  350,000   |      140,000    |

各2.5W USBスティックの価格は約8ドルです(そのうち14個をサーバーに接続しています)。

  • Virtex-7カスタムASIC:$ 3,495
  • USBスティック:$ 8

コストを使う

| Algorithm   | hashes/sec | hashes/sec/Watt | hashes/sec/$ |
|-------------|------------|-----------------|--------------|
| BCrypt(12)  |      410.4 |           20.52 |       0.1174 |
| BCrypt(5)   |   51,437   |        2,572    |      14.717  |
| PBKDF2(10k) |   35,000   |       14,000    |   4,375      |
| PBKDF2(5k)  |   70,000   |       28,000    |   8,750      |
| PBKDF2(1k)  |  350,000   |      140,000    |  43,750      |
1
Ian Boyd

私の知る限り、前述のすべてのキー派生関数は使用できます。 BCrypt.net を使用することもできます。これは、ライブラリの実装ではなく、ハッシュ値の弱点/強さを決定するアルゴリズムだからです。ライブラリが正しい値を計算する限り、問題ありません。

0
martinstoeckli