ハッシュ関数
任意の長さのデータから、固定長の値(ハッシュ値)を計算する関数。セキュリティで使う暗号学的ハッシュ関数では、ハッシュ値から元のデータを求めることや、同じハッシュ値になる別のデータを見つけることが、事実上できない。
イマシルちゃんの解説
ハッシュ関数は、データの「指紋」を取る機械みたいなものなんだ。
どんなに長い文章でも、機械に入れると、決まった長さの短い指紋が出てくる。
元の文章が1文字でも変わると、指紋はまったく別物になっちゃうんだよ。
だから、指紋を比べるだけで、データが書き換えられていないかを確かめられるんだ!
より深い解説
定義
ハッシュ関数は、入力のデータの長さに関係なく、一定の長さの出力(ハッシュ値、メッセージダイジェスト)を返す関数である。同じ入力からは、必ず同じハッシュ値が得られる。
暗号学的ハッシュ関数に求められる性質
| 性質 | 内容 |
|---|---|
| 原像計算困難性(一方向性) | ハッシュ値から、元のデータを求めることが難しい |
| 第2原像計算困難性 | あるデータと同じハッシュ値になる、別のデータを見つけることが難しい |
| 衝突困難性 | 同じハッシュ値になる、任意の2つのデータの組を見つけることが難しい |
また、入力が1ビット変わるだけで、ハッシュ値が大きく(約半分のビットが)変わる性質(雪崩効果)を持つ。
代表的なハッシュ関数
| 名前 | ハッシュ値の長さ | 状況 |
|---|---|---|
| MD5 | 128ビット | 衝突が現実的に見つけられるため、セキュリティ用途では使わない |
| SHA-1 | 160ビット | 衝突が実証されており、新しいシステムでは使わない |
| SHA-256 | 256ビット | SHA-2の一種。現在広く使われている |
| SHA-3 | 224~512ビット | SHA-2とは異なる構造で作られた新しい標準 |
主な用途
| 用途 | 内容 |
|---|---|
| 改ざんの検出 | ファイルのハッシュ値を記録・公開しておき、後で比較する(コンペア法、ダウンロードしたファイルの確認) |
| デジタル署名 | データそのものではなく、そのハッシュ値に署名する |
| パスワードの保存 | パスワードそのものではなく、ソルトを加えたハッシュ値を保存する |
| メッセージ認証 | 共通の鍵とハッシュ関数を組み合わせて、メッセージ認証コード(HMAC)を作る |
| ブロックチェーン | 前のブロックのハッシュ値を次のブロックに含めて、改ざんを困難にする |
暗号化との違い
| ハッシュ関数 | 暗号化 | |
|---|---|---|
| 元に戻せるか | 戻せない(一方向) | 鍵があれば戻せる(復号) |
| 出力の長さ | 入力にかかわらず固定 | 入力の長さに応じて変わる |
| 鍵 | 使わない | 使う |
ハッシュ値は元に戻せないため、「データを秘密にする」目的ではなく、「データが同じかどうかを確かめる」目的で使う。
パスワードの保存での注意
パスワードのハッシュ値を保存していても、よく使われるパスワードのハッシュ値をあらかじめ計算した表(レインボーテーブル)を使えば、元のパスワードを推測される。これを防ぐため、利用者ごとにランダムな値(ソルト)をパスワードに加えてからハッシュ値を計算し、さらに、計算に時間がかかるように設計された関数(bcrypt、Argon2など)を使って、総当たりを難しくする。