シナリオは次のとおりです。
- ユーザーがパスワードを入力します
- AESキーは、パスワードベースのキー派生アルゴリズムで生成されます(100ミリ秒程度かかります)
- 生成されたキーのMD5が公開されます(どこかに保存されます)
生成されたキーのMD5を公開すると、セキュリティが何らかの形で低下しますか?私が正しく理解している場合:
パスワードをハッキングするためには、最初に低速のPBKDFでキーを生成し、MD5を適用してから一致するかどうかを確認することで、パスワードをブルートフォースする必要がありますか?
とにかく文字列が暗号化キーと一致しないため、衝突するMD5文字列を見つけることは役に立たないでしょうか?
これらの仮定は正しいですか?そのような文字列を公開することは暗号化セキュリティに影響を与えるでしょうか?
回答 1 件
関連した質問
- C:SHA256生成は正しいハッシュを出力しませんか?
- ErlangはAES暗号化のために空のバイナリを返します
- Python暗号化、値エラー:ECキーを使用すると、キーデータをデシリアライズできませんでした
- キーとソルトのみを使用してOpenSSLでテキストを復号化する
- Bash OpenSSLがphp openssl_encrypt値と等しくない
- 文字列の暗号化
- RSACryptoServiceProviderキーとメッセージ長の関係を理解しようとしています
- JavaScript AES暗号化がJava Androidに対して誤った結果を示す
- Libsodium-PHPでAESを暗号化/復号化する方法
いわゆるキーチェック値。
はい。ただし、MD5を逆変換することはできませんが、SHA-256や512などの安全性の高いハッシュを使用することをお勧めします(ほとんどのランタイムで驚くほど高速です)。必要に応じて、結果の左端のNバイトを使用できます。
まあ、一種の;攻撃者は、パスワード/キーが見つかったら、それが正しいことをほぼ100%の確実性で検証できます。これは、認証された暗号化にキーを使用する場合にも当てはまります(ほとんどの状況で推奨されます)。また、一般的に、攻撃者がキーの正当性を検証するためにそれほど多くのデータを暗号化する必要はありません。
それ以外の場合、MD5は結局、一方向の機能であり、キービットを公開するべきではありません。
ノート:
もちろん、後で何かを暗号化するために、MD5への入力としてこのキーを使用したくないでしょう。
MD5関数自体がサイドチャネルデータをリークした場合(通常はリークしません)、攻撃者にキーを公開する可能性があります。
安全なハッシュを使用してキーチェック値を作成することは、すべてゼロバイトのブロックの暗号化を使用するよりもおそらく優れています。これは、PKCS#11のデフォルトのKCV生成方法です。
セキュリティを追加するには多くの方法があります。HMACまたはKBKDFを使用する、時定数を比較するなどを使用します。ただし、一般的にハッシュは安全です。 HMAC-SHA512またはHKDF-SHA512をアプリケーション固有の入力文字列と時定数比較とともに使用することは、私が思うダイヤモンド標準でしょう。