MD5 vs SHA-256: 違い、セキュリティ、それぞれをいつ使うか
MD5、SHA-1、SHA-256とSHA-3を比較します。ハッシュ関数はどのように機能し、なぜMD5が壊れているのか、速度、チェックサム、HMAC、ハッシュパスワードの正しい方法。
· 9 分で読めます
ハッシュ関数はソフトウェアで最も広く使われている構成要素です。ダウンロードを検証しファイルを削除し APIの要求に署名し Gitとブロックチェーンの動力を供給し保存されたパスワードを保護します。MD5とSHA-256は開発者が最も頻繁に遭遇する2つの名前で "まだMD5を使えるか?"という質問が絶えず浮かび上がります。簡単な答えですセキュリティに関するものはありませんが偶然の汚職を検知するにはまだ有効です。長い答えが理由とその代わりに何を使うべきかを説明します
暗号化ハッシュ関数の作用
ハッシュ関数は任意の長さの入力を受け、ダイジェストと呼ばれる固定長さの出力を生成します。MD5 は 128 ビット (32 ヘクサ文字) を生成し、SHA-256 は 256 ビット (64 ヘクサ文字) を生成する。
MD5("hello world") = 5eb63bbbe01eeed093cb22bb8f5acdc3
SHA-256("hello world") = b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
良い暗号化ハッシュには 3つのセキュリティ特性があります
- 前画像抵抗: ダイジェストを考慮すると、それを生成するインプットを見つけることは不可能です。
- **2度目の前画像抵抗:**入力がある場合、同じダイジェストで異なる入力を見つけることは不可能です。
- **衝突抵抗性:**同じダイジェストで2つの異なるインプットを見つけることは不可能です。
入力の1ビットを変更すると輸出ビットの約半分が変化します類似した入力は全く関係のないダイジェストになります。[ハッシュジェネレーター]で試してみてください: "こんにちは世界"と"こんにちは世界!"は共通点のない消化物を生成します。
MD5 の短い歴史
ロン・リベストは1991年にMD5を開発しました。ファイルチェックサムパスワード保存デジタル証明書などです。数年以内に弱点が現れ 2004年に研究者が実用的な衝突を証明しました。2008年までにチームがMD5衝突を利用して不正な証明書権限証明書を作成し 2012年にはFlameマルウェアがMD5衝突を使用して Microsoftのコード署名証明書を偽造しました。今日ではMD5衝突を生成するにはノートPCで数秒かかります
MD5に対するプレイメージ攻撃は理論的ですが衝突抵抗は完全に壊れています攻撃者が関与する署名、証明書、完全性チェックの場合は排除できます
SHA-1: 引退した
SHA-1は 160ビット出力で似たような経路をたどりました。2005年に理論的な欠陥が公表され,2017年にGoogleとCWIアムステルダムが最初の実際の衝突 ("SHAttered") を発生させた.同じSHA-1ハッシュを持つ2つの異なるPDFファイル。ブラウザでは SHA-1 証明書を受け入れなくなっており Git は SHA-256 に移行しています。SHA-1を MD5のように扱います
SHA-256とSHA-2ファミリー
2001年にNISTが発表したSHA-2には、SHA-224、SHA-256、SHA-384とSHA-512が含まれています。SHA-256は最も広く利用されている:TLS証明書、コード署名、ビットコイン、パッケージマネージャ、サブリソース・インテグリティ、JWT署名 (HS256とRS256) など。20年以上の分析を経て衝突や画像抵抗に対する実用的な攻撃はありません
SHA-512は64ビット操作を使用し、ハードウェア加速なしの64ビットCPUではSHA-256よりも速く動作する。SHA-384は短縮されたSHA-512で、長さ拡張攻撃にも耐える。
SHA-3
SHA-3 (Keccak) は2015年に標準化され、完全に異なる内部設計を使用しています。SHA-2の代替ではなく異なる特性を持つバックアップです。仕様が要求する場合は使用します.そうでなければ、SHA-256は実用的なデフォルトのままです。
横の比較
| アルゴリズム | 出力量 | 衝突耐性 | ステータス |
|---|---|---|---|
| MD5 | 128ビット | 壊れた (秒) | 安全のためじゃない |
| SHA-1 | 160ビット | 壊れた (2017) | 安全のためじゃない |
| SHA-256 | 256ビット | 安全な | 推奨デフォルト |
| SHA-512 | 512 ビット | 安全な | 推奨 |
| SHA3-256 / SHA3-512 | 256 / 512 ビット | 安全な | 推奨される代替品 |
| ブラック3 | 256ビット (拡張可能) | 安全な | 採用が急速に増えています |
スピード
MD5は純粋なソフトウェアでは SHA-256よりも速くなりますがギャップは考えられるより重要ではありません。現代のx86およびARMプロセッサには、SHA-256のハードウェア命令が含まれ、SHA-256が秒速ギガバイトで実行される。実際には、ディスクやネットワークからファイルを読み取ることは通常ハッシュではなくボトルネックです。セキュリティ以外の用途ではラウスピードが重要であれば、BLAKE3やxxHashなどの非暗号化ハッシュが両方を上回る。
MD5 がまだ受け入れられる場合
MD5の衝突弱点は誰かが意図的にインプットを作れる時だけ。適用されるのは、以下の場合です。
- 攻撃者が関与していない場合、転送や保存中に事故による腐敗を検出します。
- 信頼されるデータのキャッシュキーとデデュプリケーション、例えば自分のファイルをバケットに
- レガシー互換性、例えば MD5 チェックサムのみを公開するシステムやそれを要求するプロトコルなど。
SHA-256を選択するとコストがかかりません攻撃者が関与できないと議論する必要はありません。多くの事件は"汚職のためだけに" チェックサムから始まり後にセキュリティのために利用されました
ダウンロードを正しく確認する
ダウンロードしたハッシュを計算して各文字を比較します
sha256sum ubuntu.iso # Linux
shasum -a 256 ubuntu.iso # macOS
Get-FileHash ubuntu.iso # Windows PowerShell
ファイルが編集者がハッシュしたものと一致することを証明します。サイトを攻撃者がコントロールすればファイルとチェックサムの両方を置き換えることができます。署名されたチェックサム (GPGまたはSigstore) はそのギャップを埋める。
HMAC:キーでハッシュする
純粋なハッシュは誠実さを証明しますが信頼性を証明しません誰でも計算できます。HMACは秘密鍵とメッセージを組み合わせます鍵を持つ当事者だけが結果を生成または検証できます。Stripe、GitHub、SlackのWebhooksはHMAC-SHA256署名を使用し、JWTはHS256で署名されている。
secret + messageを連結してハッシュして自分のキー付きハッシュを作らないでください。MD5、SHA-1とSHA-256では、これは長さ拡張攻撃に脆弱です。HMACの標準構造を使いますどの言語も提供しています。署名を比較する際には、定時比較関数を使用して、タイミング攻撃を避ける。
パスワードには全く別のツールが必要です
MD5 や SHA-256 はパスワードを直接保存するために使用すべきではありません。急速なハッシュは欠点です現代のGPUは毎秒数十億の SHA-256ハッシュを計算しますデータベースを盗む攻撃者は膨大な数のパスワードを迅速にテストできます。塩分のないハッシュはもっと悪いのです計算済みのテーブルで共通のパスワードを即座に解読できるからです
パスワードのハッシング機能はゆっくりとメモリが硬くなるように設計されています
- Argon2id パスワードハッシングコンテストの優勝者であり、当選者です。
- スクリプト メモリ硬い広く利用可能
- bcrypt 古いが、まだ受け入れられる。72バイトの入力制限がある。
- PBKDF2 高い繰り返しの数を持つ準拠が NIST 承認されたプリミティブを必要とする場合。
この機能はパスワードごとに独自の塩分と設定可能なコストファクタを追加しますハードウェアが速くなるにつれて増やすことができます。Libraries handle the details: you call hash(password) and verify(password, stored)。
暗号化ダイジェスト
ダイジェストは原始バイトで、通常は六進法 (バイトあたり2文字) またはBase64 (よりコンパクト) で表示される。同じSHA-256ダイジェストは 64のヘクサ文字または44のBase64文字です。サブリソース Integrity属性は Base64 (sha384-...) を使用し、チェックサムファイルは hex を使用します。暗号化については [Base64 説明] (blog/base64-explained) をご覧ください。
意思決定ガイド
- インテグリティチェック、署名、証明書、セキュリティに関連するもの: SHA-256 (またはSHA-512、SHA-3、BLAKE3)
- 共有された秘密のメッセージの認証: HMAC-SHA256
- パスワードを保存する: Argon2id、scrypt または bcrypt 決して単純なハッシュではありません。
- 非対抗的なチェックサムやキャッシュキー: MD5は有効ですが、SHA-256はより安全な習慣です。
- 非常に高速な非セキュリティハッシュ (ハッシュテーブル、シャード): xxハッシュまたは類似の非暗号ハッシュ。
まとめ
MD5とSHA-1は衝突抵抗性のために破解されており、攻撃者がクラフト入力から利益を得ることができる場合には使用してはならない。SHA-256は安全でハードウェア対応で高速で完全性や署名のデフォルトが正しい。HMAC はキー付き認証と Argon2id はパスワード用の専用スロー機能に使用する。疑いがある場合は SHA-256 を選択してください。それは正直さに対する決して間違った答えではありません。MD5 はますますそうです。
このページは英語から自動翻訳されています。誤りを見つけた場合はお知らせください。