[〜#〜] disclaimer [〜#〜]:これは、パスワードハッシュ関数としてのMD5の推奨ではありません。並列化、GPU、およびbcryptやscryptなどの専用パスワードハッシュ関数について知っています。
それが邪魔になると、誰かが同じ文で「MD5」と「パスワードハッシュ」について言及するたびに、ハイブマインドが飛び込んできて悲鳴をあげるとき、私は少なくとも少しイライラします " MD5が壊れています! "(通常、SHA- *のような別の汎用ハッシュ関数を使用するという誤った情報の提案が続きます)。
しかし、それは本当にですか?私の知る限り、MD5に対するすべての実行可能な攻撃は、選択されたプレフィックス攻撃です。ハッシュ化されたパスワードに何らかの方法で適用できるものはありますか?
そして関連する質問:ハッシュの衝突は2n/2、特にWeb上でパスワードに対して使用した場合、それは本当に何を意味するのでしょうか?衝突を見つけたからといって、通常は長さが制限されており、おそらくバイナリセーフではないパスワードフィールドで送信できるという意味ではありません。
これは、パスワードをハッシュする目的で、プリイメージ攻撃があった場合にのみ機能が本当に壊れることを意味するのではないですか?そして、私の知る限りでは、MD5のプリイメージ攻撃は依然として2です。123.4、これは実現可能性に近いところはありません。
注:弱いパスワードをBruteforcingすると、2未満で済みます123.4、そしてはい、MD5は高速です(設計上)。 MD5のせいではない、これらの問題のどちらにも関係ありません。
衝突攻撃はパスワードhashingに影響を与えませんが、ハッシュの目的によっては詳細がいくつかある場合があります。大まかに言えば、パスワードをハッシュする場合、次の2つのことを行う必要があります。
パスワードが特定の保存された値にハッシュすることを確認します。これはpassword authenticationです(たとえば、サーバーへのログインアクセスを許可するかどうかを知るため)。
パスワードから大きな対称鍵を決定論的に計算します。これはkey derivationです(たとえば、ファイルを暗号化するため)。
パスワード検証は、プレイメージに対する耐性(値を見つける困難さmh(m)が指定された出力と一致するようなもの)に対してのみ機能します) 。ただし、鍵の導出にはそれ以上のものが必要です。理想的には、キーを導出するために、ハッシュ関数は神話的な ランダムOracle にできるだけ近い動作をする必要があります。 MD5やSHA-256などの Merkle-Damgård構文 に基づくハッシュ関数は、ランダムオラクルではないため、( "長さ拡張攻撃」);ただし、そのような関数は [〜#〜] hmac [〜#〜] で使用できます。これは、2つのネストされたハッシュ関数の呼び出しを正確に使用して、MD構築の問題を回避します。 ButHMACは、ハッシュ関数の内部プロパティに対してのみ「安全」であることが証明されています(つまり、内部「圧縮関数」はPRFと区別できないはずです) )そして、MD5の場合、このプロパティが満たされないことを知っています。それ以外の場合、衝突攻撃は実行できないためです...
要約すると、鍵の導出にMD5を使用する場合、MD5を使用する HMAC-DRBG (a PRNG繰り返しHMAC呼び出しに基づく))などのスキームを適用する必要があります。このようなスキームは、ハッシュ関数が強力である限り強力であることが知られており、衝突攻撃は直接適用されませんが、この「強度」が達成されていないことを示します。したがって、保証は無効です。 、HMAC/MD5を弱める方法ですが、MD4の例があります。MD4は衝突によって完全に破壊され(衝突は「瞬時に」発生する可能性があります)、HMAC/MD4への既知の攻撃があります。理論上の2より128。 HMAC/MD4への攻撃は衝突を悪用しませんが、衝突攻撃が設計されたのと同じソースである差動パス上に構築します。したがって、HMAC/MD5が(たとえば、128ビットに切り捨てられた場合でも)HMAC/SHA-256ほど強力ではないことが強く疑われています。
それに応じて、鍵の導出にはMD5を使用しないでください。すぐには壊れませんが、まだ問題を探しています。パスワードハッシュにMD5を使用する既存のシステムをすぐに移行する必要はありませんが、新しい設計の場合は、回避する必要があります。
必須の注意事項:もちろん、パスワードをハッシュするときは、使用目的(パスワードの検証またはキーの導出)に関係なく、適用する必要がありますsaltsおよび設定可能な遅延。パスワードはそれを管理する人間の脳の生物学的限界のため、それ自体が弱点です。ソルトと設定可能な速度低下はそれに対処する方法です:ソルトは並列処理を阻止します(攻撃者は複数のパスワードインスタンス間で攻撃コストを共有できません-たとえば Rainbow tables などの事前計算されたテーブルを介して)速度低下の敗北 ムーアの法則 (コンピュータは時間とともに高速になりますが、人間の脳はそうではありません)。したがって、「MD5のみ」でパスワードをハッシュするのではなく、 PBKDF2 または bcrypt などの専用のパスワードハッシュ関数を使用します。 PBKDF2は内部的にハッシュ関数を使用します。 MD5。 MD5(SHA-256のような)は [〜#〜] gpu [〜#〜] の計算能力に非常によく対応するため、このジョブでは問題のある選択となり、bcrypt間違いなく優れています(詳しくは 詳細についてはこの回答 を参照してください)。
衝突抵抗はパスワードのハッシュには関係ありません。重要な特性は最初のプレイメージ抵抗です。 MD5に対する唯一の実用的な攻撃は、衝突を見つけることです。
したがって、SHA-2などの他の高速ハッシュ関数には等しく適用されない、MD5ベースのパスワードハッシュに対する実際的な攻撃はありません。 MD5とSHA-2のどちらを使用する場合でも、最も強力な攻撃はパスワードを推測することです。
MD5はbrokenです。かなり簡単に衝突させることができるからです。ただし、これは、x-509証明書などのアプリケーションに転送され、衝突する可能性がありますleadつまり、証明書全体のMD5が元の証明書と衝突するような方法で証明書の公開鍵を変更します。 。
パスワードクラッキングに関してMD5の壊れた衝突抵抗から得られる唯一の利点は、MD5と同じように動作する2つの「パスワード」を見つけることです。これらの「パスワード」の1つを特定の値に制限すると、再びプリイメージ耐性に戻ります。
ウィキペディアが言うように:
2005年3月1日、Arjen Lenstra、Xiaoyun Wang、およびBenne de Wegerは、異なる公開鍵と同じMD5ハッシュを使用した2つのX.509証明書の構築を実証しました[12]。構築には、両方の公開鍵の秘密鍵が含まれていました。数日後、Vlastimil Klimaは改良されたアルゴリズム[13]について説明し、単一のノートブックコンピュータで数時間でMD5衝突を構築できるようにしました。 2006年3月18日、Klimaは、トンネリングと呼ばれる方法を使用して、1台のノートブックコンピュータで1分以内に衝突を検出できるアルゴリズム[14]を公開しました。
3番目の段落は興味深いです。ここでは、すべてのプリイメージがパスワードフィールドに収まるとは限らないと主張しています。あなたもおそらくここで正しいです。そのようなパスワードの入力mayは、MD5の計算にできるだけ近い、より低いレベルで行う必要があります。
ハッシュ関数は、プリイメージの耐性が壊れたときにのみ真に壊れると言うかもしれませんが、多くのアプリケーション、特にドキュメントの署名では、MD5の壊れた衝突耐性が重要です。重要なドキュメントをMD5メッセージ認証コードでハッシュするとします。敵対者は、巧妙な形に見え、まったく異なるストーリーを伝え、それでもまったく同じMD5を生成する文書を複製できる可能性があります。これをlead衝突と呼ぶことができます。
それが言われたとき、このパスワードを見つけてみてください:2c89571cdfd318509c05d1f19fe26336