あらゆるデータ――1つの単語、1冊の小説、4GBの動画――を、そのデータを一意に識別する短い固定長の文字列に変換できるとしたらどうでしょうか。元のデータのカンマ1つを変えるだけで、その文字列は完全に異なるものになります。そして、その処理を逆にして元のデータを復元する方法はありません。
これこそが暗号学的ハッシュ関数が行うことです。現代のセキュリティにおいて最も基本的な構成要素の1つであり、あなたのオンライン上のほぼすべての活動を静かに保護しています。
フィンガープリントのたとえ
ハッシュはデジタルフィンガープリント(指紋)のように機能します。指紋はあなたを一意に識別しますが、指紋からあなたの顔を復元することはできません。同様に、暗号学的ハッシュはデータを一意に識別しますが、そのデータの内容を明かすことはありません。
任意の入力をハッシュ関数に与えると、ダイジェスト(ハッシュ値やチェックサムとも呼ばれます)が得られます。これは固定長の16進数文字列です。最も一般的なアルゴリズムの1つであるSHA-256は、入力のサイズに関係なく常に64文字の出力を生成します。
| 入力 | SHA-256ダイジェスト(先頭16文字) |
|---|---|
Hello |
185f8db32271fe25... |
hello |
2cf24dba5fb0a30e... |
| Wikipedia全体のダンプ | (それでも64文字) |
4つの本質的な性質
関数が暗号学的ハッシュとして認められるには、以下の性質を満たす必要があります:
- 決定性。 同じ入力は常に同じ出力を生成します。どのマシンでも、いつでも同じです。
- 一方向性(原像耐性)。 ハッシュから元の入力を見つけることは計算上不可能です。データを「逆ハッシュ」することはできません。
- 衝突耐性。 同じダイジェストを生成する2つの異なる入力を見つけることは実質的に不可能です。SHA-256では、偶発的な衝突の確率はおよそ2^128分の1――これは観測可能な宇宙の原子の数よりも大きい数です。
- 雪崩効果。 入力の1ビットを変更すると、出力のおよそ半分のビットが反転します。類似した入力間に検出可能なパターンや関係はありません。
重要な区別: ハッシュは暗号化ではありません。暗号化は鍵があれば元に戻せますが、ハッシュは意図的に不可逆です。データを転送中に保護するために暗号化します。データの整合性を検証したり、元のデータを保持せずに証明を保存するためにハッシュします。
一般的なハッシュアルゴリズム
MD5(1991年)
- 出力: 128ビット(16進数32文字)
- 状態: 暗号学的に破られています。研究者はノートパソコンで数秒以内に衝突を生成できます。
- まだ見られる用途: ファイルダウンロードのセキュリティに関係しないチェックサムやレガシーシステム。
SHA-1(1995年)
- 出力: 160ビット(16進数40文字)
- 状態: セキュリティ用途では非推奨。Googleは2017年に実用的な衝突を実証しました(「SHAttered」攻撃)。
- まだ見られる用途: 古いGitリポジトリ、一部のレガシー証明書。
SHA-256(2001年)
- 出力: 256ビット(16進数64文字)
- 状態: 現行の標準。既知の実用的な攻撃はありません。
- 用途: TLS証明書、Bitcoin、パスワードハッシュ、デジタル署名、ファイル整合性検証。
SHA-3(2015年)
- 出力: 可変(一般的に256ビット)
- 状態: 最新の標準で、SHA-2ファミリーとは全く異なる内部設計(Keccakスポンジ構造)に基づいています。
- 用途: 将来を見据えたシステム、Ethereum、アルゴリズムの多様性が必要な状況。
| アルゴリズム | 出力サイズ | 安全? | 速度 |
|---|---|---|---|
| MD5 | 128ビット | いいえ | 非常に高速 |
| SHA-1 | 160ビット | いいえ | 高速 |
| SHA-256 | 256ビット | はい | 中程度 |
| SHA-3-256 | 256ビット | はい | 中程度 |
暗号学的ハッシュの用途
パスワードの保管
アカウントを作成する際、適切に設計されたシステムはパスワードを平文で保存しません。ハッシュを保存します。ログイン時に、システムは入力されたパスワードをハッシュ化し、保存された値と比較します。データベースが侵害されても、攻撃者が得るのはハッシュであり、パスワードそのものではありません。
現代のシステムはさらに進んで、ランダムなソルト(ハッシュ化前に追加される余分なデータ)を加え、bcrypt、scrypt、Argon2のような意図的に低速なアルゴリズムを使用して、総当たり推測を非現実的にしています。
ファイル整合性の検証
ソフトウェアの配布者は、ダウンロードファイルと一緒にSHA-256チェックサムを公開します。ダウンロード後、あなたのマシンでファイルのハッシュを計算して比較します。一致すれば、転送中にファイルが破損したり改ざんされたりしていないことが証明されます。
デジタル署名
文書にデジタル署名をする場合、システムはまず文書をハッシュ化し、次にそのハッシュを秘密鍵で暗号化します。受信者は公開鍵でそれを復号し、自分で計算した文書のハッシュと比較します。これは文書全体を暗号化するよりもはるかに効率的で、作成者と整合性の両方を証明します。
ブロックチェーン
ブロックチェーンの各ブロックには前のブロックのハッシュが含まれ、改変不可能なチェーンを形成します。過去のトランザクションを変更するとそのブロックのハッシュが変わり、その地点からチェーンが壊れるため、改ざんがただちに可視化されます。
なぜMD5とSHA-1は破られたと見なされるのか
ハッシュアルゴリズムが「破られた」とは、同じハッシュを生成する2つの異なる入力を意図的に作成できることです(衝突)。これは一意性に依存するすべてのユースケースを損ないます。
- MD5: 衝突は数秒で生成可能です。研究者はMD5ハッシュが同一の2つの異なるPDFファイルを作成しています。
- SHA-1: 2017年のSHAttered攻撃は、SHA-1ハッシュが同一の2つの異なるPDFを生成しました。単一CPUでは約6,500年の計算が必要でしたが、クラウドリソースを使えば実現可能でした。
実用的なルール: セキュリティ関連の用途――パスワード、証明書、デジタル署名、攻撃者が関与する可能性のある整合性チェック――にはMD5やSHA-1を決して使わないでください。代わりにSHA-256またはSHA-3を使用してください。
さらに詳しく
ハッシュは、実際に試してみると直感的に理解できる概念の1つです。文章をハッシュ化し、1文字変更して、雪崩効果を自分の目で確認してみましょう。
- ハッシュの生成と検証の方法 — ステップバイステップのチュートリアル
- ハッシュジェネレーター — ブラウザ上でSHA-256、MD5、SHA-512などを即座に計算
- ハッシュ識別ツール — 不明なハッシュを貼り付けてアルゴリズムを特定
