ハッシュの仕組み ― 元に戻せない一方通行の変換が世界を守る


ハッシュ関数の仕組み 入力 "hello" 入力(1文字違い) "hellp" ハッシュ関数 (SHA-256) 一方通行・不可逆 固定長出力 2cf24dba5f... 固定長出力 a17b2c90e3... ⬇ 1文字の違いで出力が激変(雪崩効果) ハッシュの主な用途 パスワード保護 bcrypt / Argon2 +ソルト&ペッパー データ改ざん検知 SHA-256 マークルツリー 高速検索 HashMap O(1) ルックアップ 分散システム Git / ブロック チェーン
ハッシュ関数の仕組みと主な用途
ひよこ ひよこ

ハッシュってよく聞くけど、何をしてるの?

ペンギン先生 ペンギン先生

ハッシュ関数は「どんなデータも固定長の文字列に変換する一方通行の関数」だよ。たとえば「hello」を入れると「2cf24dba...」みたいな決まった長さの値が出てくる。同じ入力には必ず同じ出力が返るけど、出力から入力を逆算することはできないんだ。

ひよこ ひよこ

一方通行ってことは、暗号化とは違うの?

ペンギン先生 ペンギン先生

いい質問だね。暗号化は「鍵があれば元に戻せる」けど、ハッシュは「誰にも元に戻せない」のが大きな違いだよ。だからパスワードの保存にぴったりなんだ。サーバーにはハッシュ値だけ保存しておいて、ログイン時に入力されたパスワードをハッシュ化して比較する。万が一データが漏れても、元のパスワードはわからないってわけ。

ひよこ ひよこ

へぇ〜!でも1文字でも変えたらどうなるの?

ペンギン先生 ペンギン先生

これがハッシュの面白いところで、「雪崩効果(アバランチ効果)」っていうんだけど、入力を1ビットでも変えると出力がまったく別物になるんだ。「hello」と「hellp」のハッシュ値は全然違う。だから改ざん検知にも使えるよ。

ひよこ ひよこ

MD5とかSHA-256とか種類があるよね?何が違うの?

ペンギン先生 ペンギン先生

MD5は128ビット、SHA-1は160ビットSHA-256は256ビットの出力を返すよ。MD5とSHA-1は「衝突」が見つかっていて、異なる入力から同じハッシュ値を意図的に作れてしまうんだ。Googleが2017年にSHA-1の衝突を実証して大きなニュースになったね。今はSHA-256やSHA-3が推奨されているよ。

ひよこ ひよこ

衝突ってそんなに問題なの?

ペンギン先生 ペンギン先生

大問題だよ。たとえば電子署名にMD5を使っていた場合、攻撃者が「同じハッシュ値を持つ偽の証明書」を作れてしまう。実際に2008年にMD5の衝突を悪用した偽のSSL証明書が作られたんだ。ちなみに衝突の起こりやすさは「誕生日のパラドックス」で説明できて、256ビットのハッシュでも2の128乗回程度の試行で50%の確率で衝突が見つかるんだよ。

ひよこ ひよこ

パスワードの保存にはどんなハッシュを使うの?

ペンギン先生 ペンギン先生

パスワード専用のハッシュ関数があるんだ。bcryptArgon2が代表的だよ。普通のSHA-256は高速すぎて、攻撃者がGPUで毎秒何十億回も試行できてしまう。bcryptArgon2は「わざと遅い」設計になっていて、さらに「ソルト」というランダムな値をパスワードに付加してからハッシュ化する。これでレインボーテーブル(事前計算済みハッシュの辞書)攻撃も防げるんだ。「ペッパー」というサーバー側の秘密値を追加することもあるよ。

ひよこ ひよこ

ハッシュテーブルっていうデータ構造もハッシュを使ってるの?

ペンギン先生 ペンギン先生

そうだよ!HashMapやDictionaryの中身はハッシュテーブルだね。キーをハッシュ関数に通して配列インデックスを計算し、そこに値を格納する。だから検索がO(1)で超高速なんだ。ただし異なるキーが同じインデックスになる衝突が起きることがあって、チェイン法(リンクリストで連結)やオープンアドレス法(別の空き場所を探す)で対処するよ。

ひよこ ひよこ

Gitブロックチェーンでもハッシュを使ってるって聞いたけど?

ペンギン先生 ペンギン先生

マークルツリーという仕組みだね。データをブロックに分けてそれぞれハッシュ化し、隣同士のハッシュをさらにハッシュ化して…と繰り返してツリー構造を作る。最終的に1つのルートハッシュが得られて、どこか1箇所でも改ざんされるとルートハッシュが変わるから即座に検知できるんだ。Gitのコミットハッシュもこの仕組みで、ブロックチェーンの各ブロックも前ブロックのハッシュを含んでいるよ。

ひよこ ひよこ

他にもハッシュの攻撃手法ってあるの?

ペンギン先生 ペンギン先生

「長さ拡張攻撃(Length Extension Attack)」というのがあるよ。MD5やSHA-1、SHA-256は内部構造がMerkle-Damgard構造で、ハッシュ値から内部状態を復元できてしまう。つまりhash(secret + message)の値を知っていれば、secretを知らなくてもhash(secret + message + padding + 追加データ)を計算できるんだ。これを防ぐためにHMACという方式や、SHA-3(Keccak)のようなスポンジ構造の関数が使われているよ。

ひよこ ひよこ

ハッシュって奥が深いんだね!

ペンギン先生 ペンギン先生

本当にそうだね。セキュリティデータ構造、分散システム、暗号通貨…あらゆるところでハッシュが活躍している。大事なのは「用途に合ったハッシュ関数を選ぶ」こと。パスワードにはbcrypt/Argon2、データの完全性検証にはSHA-256、高速なルックアップにはハッシュテーブル用のハッシュ関数、というように使い分けることが重要だよ。