MD5、SHA-256、SHA-3 どのハッシュアルゴリズムが必要ですか?
MD5、SHA-1、SHA-256、SHA-3、BLAKE3の直接比較——各アルゴリズムが適切な場面、その失敗点、およびデフォルトで使用すべきアルゴリズム。
まだMD5をデフォルトで選んでいる場合は、あなたは多くの人が同じ状況にあります。そして、おそらく間違った選択をしている可能性があります。ハッシュ関数はすべて、データの固定長の指紋を生成しますが、それらは互換性を持ちません。間違った選択は、過剰な過剰な対策または本物のセキュリティの失敗に繋がります。どの方向を間違えたかによって異なります。
それぞれのアルゴリズムが実際に何をやっているか、どこで失敗するか、そして何に代用すべきかを紹介します。
ハッシュ関数が何をやっているか
暗号ハッシュ関数は、入力のサイズにかかわらず、固定長の出力を作り出します。これは決定論的で、逆算が不可能であり(理想的には)衝突抵抗性を持っています。同じ入力は常に同じハッシュを生成します。逆算はできません。また、入力に1バイトの変更があると、出力が完全に変化します。
これらの3つの性質により、ハッシュ関数はデータの整合性を確認、文書の署名、チェックサムの作成に役立ちます。以下のアルゴリズムはすべてこれを行います。それらが異なるのは、攻撃に対してどれだけ耐えられるか、そしてどれだけ速く実行できるかです。
MD5:セキュリティ用途で使わないでください
MD5は128ビットのハッシュを生成し、速いという点が問題です。1991年に設計され、2004年に研究者が衝突攻撃を示しました。今日、異なる2つのファイルが同じMD5ハッシュを生成するということは、計算的に非常に簡単です。
どこで失敗するか: すべてのセキュリティコンテキスト — 信頼できないチャネルでのファイルの整合性チェック、デジタル署名、TLS証明書など。
まだ問題ない場面: セキュリティではないチェックサム。ファイルの重複削除、キャッシュキーの生成、制御可能なシステム内のコンテンツの指紋化 — MD5は速く、十分に良いです。衝突が問題になるのは、攻撃者がそれを利用できる場合だけです。
MD5ハッシュを迅速に生成したいですか? MD5生成器.
SHA-1:廃止されたがまだ存在する
SHA-1は160ビットの出力を作り出し、同じ根本的な問題があります:衝突攻撃が証明されています。GoogleのSHAttered攻撃(2017年)により、2つの異なるPDFファイルが同じSHA-1ハッシュを持つことが、現在の攻撃者にとって実用的に可能になりました。
デジタル署名やTLS証明書のため、公式に廃止されています。Gitでは、コンテンツ識別子として使用されています。そのリスクモデルは異なり、GitはすでにSHA-256に移行しています。
ルール: 新しいセキュリティに重要な作業ではSHA-1を使わないでください。古くからのシステムでは、移行をフラグにします。
SHA-256およびSHA-512:現在の標準
SHA-256(SHA-2ファミリの一部)は、ほとんどの暗号アプリケーションでデフォルトとして使用すべきです。256ビット出力、現実的な攻撃が知られていない、そしてすべての言語およびプラットフォームでサポートされています。
SHA-512は512ビットの内部状態を使用し、512ビットの出力を作ります。64ビットCPUでは、ブロック処理の仕方により、大規模な入力に対して 速い SHA-256よりも速いです。アプリケーション層のほとんどの作業ではSHA-256が十分です。高スループットデータ処理やキー生成に追加の余裕が必要な場合は、SHA-512をベンチマークしてください。
使用する場面: ファイルの整合性チェック、HMAC、証明書署名(RSA/ECDSA)、APIリクエストの署名、JWTトークンなど。
SHA-3:異なるアーキテクチャ、限定的な用途
SHA-3(Keccak)は、2015年にNISTがSHA-2の構造的代替として選ばれました。SHA-2はMerkle-Damgård構造を使用するのに対し、SHA-3はスポンジ構造を使用します。もしSHA-2の設計に根本的な弱点が発見された場合、SHA-3は影響を受けません。
出力サイズ(SHA3-256、SHA3-512など)は同じであり、現在のセキュリティ分析を通過していますが、純ソフトウェアでは通常SHA-256よりも遅いです。
使用する場面: SHA-2に依存しない長期的な暗号システム — ハードウェアセキュリティモジュール、特定の政府または規制環境、またはSHA-2の将来の弱点を回避するために明示的に対策を取る場面。ウェブアプリケーションでは、これは理論的な過剰です。
BLAKE3:現代のパフォーマンス選択
BLAKE3はまだNIST標準ではありませんが、実際の採用は広がっています:Rustの cargo、Baoのストリーミングハッシュ形式、そして増加するセキュリティおよびストレージツールが使用しています。並列処理を設計しており、ソフトウェアではSHA-256よりも速く、現在の暗号分析に対して耐えています。
使用する場面: 高パフォーマンスチェックサム、コンテンツアドレス化、両端を制御し、スピードを犠牲にせずにセキュリティを確保する場面。SHA-2が明示的に規格で指定されている場所(X.509証明書、JWTなど)では避けてください。
ハッシュアルゴリズム比較
| アルゴリズム | セキュリティ状況 | 出力サイズ | 速度(ソフトウェア) | 用途 |
|---|---|---|---|---|
| MD5 | 破綻(衝突) | 128ビット | 非常に速い | セキュリティではないチェックサム、重複削除 |
| SHA-1 | 破綻(衝突) | 160ビット | ファスト | 古くからの用途;GitコンテンツID |
| SHA-256 | 安全な | 256ビット | ファスト | 一般用途 — デフォルト選択 |
| 512ハッシュ | 安全な | 512ビット | 64ビットCPUで大きなデータに対して速い | 高スループットまたは追加の余裕 |
| SHA-3 | 安全な | 224–512ビット | ソフトウェアでは遅い | SHA-2に依存しない長期的なシステム |
| BLAKE3 | 安全な | 256ビット | 非常に速い(並列) | パフォーマンスに依存するコンテンツアドレス化 |
SHA-256の計算
SHA-256ハッシュを計算する3つの簡単な方法:
Python:
import hashlib
data = b"hello world"
digest = hashlib.sha256(data).hexdigest()
print(digest)
# Output: b94d27b9934d3e08a52e52d7da7dabfac484efe04294e576fba1d63e8d4d0b4b
Node.js:
const { createHash } = require('crypto');
const digest = createHash('sha256')
.update('hello world')
.digest('hex');
console.log(digest);
Bash:
echo -n "hello world" | sha256sum
コードを書かずに何かをハッシュしたいですか? ハッシュ生成器 MD5、SHA-1、SHA-256、SHA-512など、ブラウザから直接サポートしています。
決定ガイド
| 用途 | 使用するべきもの |
|---|---|
| 重複削除/キャッシュキー | MD5またはSHA-256 |
| 信頼できるチャネルでのファイルの整合性 | MD5は問題ない |
| 信頼できないダウンロードやファイルの整合性 | SHA-256 |
| デジタル署名 | SHA-256またはSHA-512 |
| HMACおよびAPI認証 | SHA-256 |
| TLS証明書 | SHA-256 |
| パスワードの保存 | bcrypt、Argon2、またはscrypt — 上記のいずれでもない |
| 高パフォーマンスコンテンツアドレス化 | BLAKE3 |
| 規格準拠 | SHA-256(規格要件を確認) |
一つだけ明確に言うべき点:これらのアルゴリズムのいずれも、パスワードを直接ハッシュするべきではありません。すべてが速い設計であり、これはブートフォース攻撃に利用されやすいです。bcrypt、Argon2id、またはscryptを使用してください — これらは意図的に遅く、メモリ効率を高めることで、パスワードの破壊を防ぐために設計されています。
短い答え
新しいコードの場合: デフォルトでSHA-256を使用します。 出力サイズが大きいためまたは64ビットハードウェア上で大きなストリームをハッシュする必要がある場合は、SHA-512を使用します。パフォーマンスが非常に重要で、両端を制御できる場合はBLAKE3を使用します。SHA-3は、SHA-2に依存しない特定のアーキテクチャ的理由がある場合にのみ使用します。
MD5は、衝突がセキュリティ上の問題ではない内部指紋化や重複削除に適しています。攻撃者がマッチを偽造できる場面では、MD5は適していません。
わからない場合は、SHA-256を使用します。これは10年間の正しい答えであり、見通しの未来においてもそのままであるでしょう。
あなたも好きかもしれません
恵 スコアボードが到着しました!
スコアボード ゲームを追跡する楽しい方法です。すべてのデータはブラウザに保存されます。さらに多くの機能がまもなく登場します!
