ハッシュ関数は任意の大きさのデータを固定長の「指紋」に変えます。ファイルのダウンロード、パスワード保存、電子署名、重複排除など、あらゆる場面で使われています。しかし、今日でも安全に使えるハッシュ関数ばかりではありません。MD5・SHA-256・SHA-512 を比較し、正しい使い方を説明します。
同じ入力、3 つの長さ。
helloをハッシュ生成に通すと:MD5 5d41402abc4b2a76b9719d911017c592 (16 進 32 文字 = 128 ビット) SHA-1 aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d (40 = 160 ビット) SHA-256 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 (64 = 256 ビット)同じアルゴリズムなら入力の長さに関係なくハッシュ長は一定です。だからこそ指紋として使えます。ただし長さが安全性の話ではありません。MD5 と SHA-1 には実用的な衝突攻撃があり、SHA-256 にはありません。上のどの行を別のツールに入れても、まったく同じ結果になるはずです。
ハッシュとは(何でないか)
暗号学的ハッシュは一方向関数です。出力から入力を復元することはできません。同じ入力は常に同じ出力を生み、1 文字変えるだけで結果は完全に変わります。だからこそ完全性チェックやパスワード保存に使われます——比較するのは指紋であって、元データではありません。
ハッシュは暗号化ではなく(鍵も復号もありません)、エンコードでもありません(Base64 のように誰でも復元できるもの)。
なぜ MD5 は破られたとされるのか
MD5 は 128 ビットのハッシュを生成し、かつて広く使われていました。問題は衝突——異なる入力が同じハッシュを生むことです。研究者は何年も前から MD5 の衝突を安価に作れており、MD5 はもはや完全性を保証できません。攻撃者が正規ファイルと同じ MD5 を持つ悪意あるファイルを作れてしまうのです。
このため、MD5(および古い SHA-1)はセキュリティ用途に使うべきではありません。当サイトのハッシュ生成ツールは、MD5・SHA-1 も SHA-2 系と並べて計算します——並べて見比べることで、古いアルゴリズムがファイルのチェックサムのような非セキュリティ用途にしか向かない理由を自分の目で確認できるようにするためです。
SHA-256 vs SHA-512
どちらも SHA-2 ファミリーに属し、今日では安全とされています。違いは:
- SHA-256 は 256 ビット(16 進 64 文字)のハッシュを生成します。最も広く使われ、優れた既定値です。
- SHA-512 は 512 ビット(16 進 128 文字)のハッシュを生成します。出力が長く、64 ビットハードウェアではむしろ速いこともあります。
大半の用途——ファイルのチェックサム、完全性チェック、一般的な指紋——では SHA-256 が妥当な既定値です。規格やプロトコルがより長いダイジェストを要求する場合に SHA-512 を選びます。
名前の中の数字はダイジェストのビット長で、入力 1 つで具体的になります。以下の 4 つはいずれも hello という語を、私たちのハッシュ生成ツールがブラウザ内で計算したものです:
MD5 5d41402abc4b2a76b9719d911017c592 (32 桁の 16 進 / 128 bits)
SHA-1 aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d (40 桁の 16 進 / 160 bits)
SHA-256 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 (64 桁の 16 進 / 256 bits)
SHA-512 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043 (128 桁の 16 進 / 512 bits)
次に最初の 1 文字だけ大文字にします。Hello の SHA-256 は 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969 で、上の hello の値と共通部分はまったくありません。それでも長さは同一です。代わりに 2 時間の動画ファイルを入れても、4 つの長さはこのままです。入力の大きさに関係なく出力長が固定であること —— それがハッシュをハッシュにしています。この 4 つの選択は「その出力をどれだけ偽造しにくいか」だけの問題です。
パスワードを保存する正しい方法
重要な点です:パスワードは単純なハッシュで保存すべきではありません。SHA-256 でも同様です。高速なハッシュは現代のハードウェアで総当たり攻撃されやすいためです。代わりに、意図的に遅く、ソルト付きのパスワード専用ハッシュアルゴリズム、すなわち bcrypt、scrypt、Argon2 を使います。これらはパスワードごとに固有のランダムなソルトと、調整可能な作業係数を加えて解読に抵抗します。
覚え方:
- ファイル完全性 / 指紋 → SHA-256(または SHA-512)。
- パスワード保存 → ソルト付きの bcrypt / scrypt / Argon2——裸の SHA ハッシュは決して使わない。
アルゴリズムを強くしてもパスワード保存は解決しません。password の SHA-256 は 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 —— その MD5 と同じくらい公開された値です。速いハッシュは攻撃者にとっても速いからです。パスワード保存に必要なのは意図的に遅い関数(bcrypt、scrypt、Argon2)と利用者ごとのソルトです。ダイジェスト長はこの問題には無関係です。
ダウンロードの検証
ハッシュのよくある正当な用途は、ダウンロードしたファイルが破損・改ざんされていないかの確認です。配布者がファイルの SHA-256 を掲載し、あなたは自分のコピーのハッシュを計算して比較します。一致すればファイルは無傷です。
当サイトの無料ハッシュ生成ツールなら、ブラウザで SHA-256・SHA-384・SHA-512 を計算できます。標準の Web Crypto API を使うため、入力は送信されません。