web-dev-qa-db-ja.com

何かを暗号化するために使用される前にパスワードがハッシュされるのはなぜですか?

製品のセキュリティに関するドキュメントを読んでいると、ベンダーがこのパスワードを直接使用する代わりに、パスワード(SES-2)を使用してデータ(AES-256)を暗号化していることがわかりました。

そうすることの利点はありますか?

攻撃者は、このSHA-2-as-a-passwordキーを使用して暗号化されたデータをクラックするのではなく、(可能であれば)パスワードキースペースを使い果たして、そのハッシュを試します。したがって、私が考えることができる唯一の理由は、余分な計算ステップ(ハッシュの作成)があることです。攻撃の計算を複雑にすることが目的の場合は、パスワードエントロピーをかなり増やしていただろう。

53
WoJ

鍵導出関数(KDF) のプリミティブバージョンのように聞こえますが、特に PBKDF2 を使用することで、ホイールの再発明を回避できた可能性があります。

パスワードを直接AESキーとして使用したくない理由はいくつかあります。

  1. ビットを配布します。ここでの主な特性は、ハッシュ関数の出力が統計的に言えば均一に分散されていることです。人々は完全にランダムではないパスワードを選択する傾向があり、特に、ほとんどのパスワードにはキーボードで入力できる文字しか含まれていません。暗号化キーとして使用すると、統計的にランダムでないキーが暗号化機能の弱点を露呈する可能性があります。

  2. キーを暗号化キーの長さに合わせる。ほとんどのパスワードは、暗号化機能のキースペースよりも長くなるか短くなります。パスワードをハッシュすることにより、正確なキーの長さは、暗号化関数の入力キーのサイズと正確に同じになります。派生キーのエントロピーは増加しませんが、これにより、単にパスワードをゼロパッドするか、さらに悪い場合にはパスワードを切り捨てるだけで、暗号化機能の弱点が露呈する可能性が回避されます。

  3. 鍵導出の復号化を遅くします。あなたの説明によれば、ソフトウェアは単一のSHA256ラウンドのみを使用しています。しかし、PBKDF2のような適切なパスワードベースのKDFを使用すると、通常、基礎となるハッシュ関数が数万回または数十万回実行されます。これにより、キーの計算が遅くなり、長さを増やさずにパスワードの有効強度が向上します。

  4. ユーザーのプレーンテキストのパスワードをメモリから除外し、休止状態またはクラッシュダンプ中に誤ってディスクにダンプされないようにします。これは、ハッシュを使用して暗号化しているデータを復号化することから保護しませんが、パスワードが他のファイル(おそらく異なるソルトを使用している)を復号化するために再利用されたり、オンラインアカウントやその他のデバイスで試行されたりすることを防ぎますあなたが使う。

97
Lie Ryan

SHA-256は、任意の長さのパスワードから256ビットのハッシュを生成します。このハッシュは技術的には(適切な長さなので)AES-256のキーとして使用できます。

これ以上のコンテキストがなければ、256ビットのキーを生成する最も簡単な方法を探していたと思います。

あなたが述べたように、ここでの弱点はパスワードであり、パスワードの単一のSHA-256は、パスワードに対するブルートフォース攻撃を防ぐには安すぎる。

代わりに、パスワードベースの鍵導出関数(PBKDF)を使用する必要があります。また、キーを直接使用するべきではなく、代わりにそれを使用して、より優れたCSPRNGを使用して生成されたキーを暗号化します。

https://crypto.stackexchange.com/questions/22678/how-secure-is-it-to-use-password-as-aes-key でこのトピックの非常に優れた議論を見つけることができます=。

14
Marc

コンテキストがなければ、答えるのは難しいです。これは単純な単純なパスワード拡張メカニズムである場合もあれば、他の何かである場合もあります。たとえば、別の当事者がデータを復号化し、必要なキーを保存する必要がある場合があります。

ハッシュを使用することで、元のユーザーのパスワードをある程度保護します。大したことではありませんが、それでも単にパスワード自体を保存するよりははるかに優れています。

5
Stephane