ハッシュ解説:MD5、SHA、そしていつ使うか
ハッシュ関数はデータをフィンガープリントに変えます。仕組みと、MD5がまだ死んでいない理由。
ファイルをダウンロードします。ウェブサイトにMD5チェックサムが表示されています。どうにかして検証するべきだと。でも、なぜ?そしてMD5とSHA-256の違いは?
ハッシュ関数はソフトウェアのあらゆる所にあります。理解すれば正しく使えます。
ハッシュが何をするか
ハッシュ関数は任意の入力を受け取り、固定サイズの出力を生成します。同じ入力には常に同じ出力。入力の1ビットが変わると、出力が完全に変わります。
"hello" → 5d41402abc4b2a76b9719d911017c592 (MD5)
"Hello" → 8b1a9953c4611296a827abf8c47804d7 (MD5)
1つの大文字がハッシュ全体を変えます。それがポイントです。
ハッシュ vs 暗号化
ハッシュは一方向。元データを復元するためにハッシュを逆変換できません。
暗号化は双方向。正しいキーがあれば、復号化して元データを復元できます。
誰かがMD5ハッシュを「復号化」できると言ったら、クラック(一致する入力を見つけるまで試行)しているか、ハッシュの仕組みを誤解しているかです。
一般的なアルゴリズム
MD5 - 128ビット出力。高速だが暗号的には破られています。チェックサムには問題なし、セキュリティには不可。
SHA-1 - 160ビット。暗号用途でも破られています。レガシーシステムではまだ使われています。
SHA-256 - 256ビット。現在の標準。セキュリティが重要な時はこれを使いましょう。
SHA-512 - 512ビット。わずかにより安全、64ビットシステムでは時に高速。
BLAKE2/BLAKE3 - 現代の代替。SHA-256より高速で同等のセキュリティ。
MD5が問題ない場面
MD5は「破られている」ため悪評を得ています。でも暗号的に破られているからといって無用というわけではありません。
ファイル整合性チェック。 ダウンロードが破損していないことを検証。攻撃者は同じハッシュの悪意あるファイルを作る必要があり、それは非セキュリティ文脈のほとんどの攻撃が価値あるより多くの労力を要します。
キャッシュキー。 コンテンツをハッシュして一意な識別子を生成。セキュリティへの影響なし。
重複除去。 ハッシュを比較して重複ファイルを見つける。
SHA-256以上を使うべき時
パスワード保存。 実際には、代わりにbcryptやArgon2を使いましょう。パスワード用に設計されています。
デジタル署名。 敵対者が偽造を試みる可能性があるドキュメント整合性。
セキュリティクリティカルなあらゆること。 攻撃者が衝突を見つける動機がある時。
衝突問題
衝突は、2つの異なる入力が同じハッシュを生成する時です。誕生日の数学では、衝突は予想より早く起こりやすくなります。
MD5では、研究者は意図的な衝突を作る方法を見つけています。異なる2つのファイル、同じハッシュ。それが「破られている」理由です。
SHA-256では、実用的な衝突攻撃は存在しません。まだ。
実践例
ダウンロード検証:
sha256sum ubuntu.iso
# 出力をダウンロードページのハッシュと比較
APIキーの保存: 実際のキーではなく、ハッシュを保存。ユーザーがキーを送信したら、ハッシュして比較。
Gitコミット:
GitはSHA-1を使ってコミットを識別します。だからコミットハッシュが a1b2c3d4e5f6... のように見えるのです。
独自実装しない
絶対に独自のハッシュスキームを発明しないでください。「MD5を2回」や「ソルトを付加したSHA-256」は、確立されたパターンを使うより悪いです。
パスワード用:bcrypt、scrypt、またはArgon2。 整合性用:SHA-256。 速度用:BLAKE3。
専門家がすでに解決しています。
ハッシュ関数は概念的にはシンプルですが、応用ではニュアンスがあります。仕事に適したアルゴリズムを選び、単純なチェックサムで済む所で暗号的ハッシュを使わないようにしましょう。