ひとことで言うと
ハッシュは、任意のデータを決まった長さの値(ハッシュ値)に変換する一方向の処理で、元のデータに戻すことができないことが特徴です。
同じデータを入力すれば必ず同じハッシュ値が出力されます。 少しでも内容が違えばハッシュ値は大きく変わります。 この性質を使って、パスワードの保管やデータの改ざん検出に広く使われています。
たとえ話でもう少し詳しく
ハッシュは、肉をミンチにする調理に近いです。
- どんな形の肉でも、同じ機械を通せば同じ見た目のミンチになる
- ミンチにした肉を元の形に戻すことはできない
- 同じ肉を同じ機械に通せば、毎回同じミンチが出てくる
ハッシュ関数も同じです。 「password123」というテキストをハッシュ関数に通すと「ef92b778…」のような固定長の値が出ます。 元の文字列には戻せませんが、「password123」を入れれば必ず同じ値が出るので、「一致するかどうか」を比較できます。
よく出る場面・使いどころ
- パスワードの保存(パスワードそのものではなくハッシュ値を保管する)
- ファイルが改ざんされていないかの確認(ダウンロードしたファイルのハッシュ値を公開値と照合する)
- デジタル署名の仕組み(大きなデータのハッシュ値に署名することで効率化)
- ブロックチェーンの連鎖構造(前のブロックのハッシュを次のブロックに含める)
似た言葉との違い
- 暗号化
- 正しい鍵を使えば元のデータに戻せる(可逆的)
- ハッシュは元に戻すことを想定しない(不可逆的)
- エンコーディング
- 決まったルールで変換するが、逆変換で元に戻せる
- ハッシュは逆変換ができない点が根本的に異なる
- チェックサム
- データの誤りを検出するための検査値
- ハッシュの用途の一つ。ハッシュ関数を使ってチェックサムを生成することが多い
実務で気にするポイント
- 古いハッシュ関数(MD5・SHA-1)は衝突(異なるデータが同じハッシュ値になる)が見つかっており、セキュリティ用途には使わない
- パスワードのハッシュには「ソルト(ランダムな値を加えてからハッシュする処理)」を組み合わせ、同じパスワードでも違うハッシュ値になるようにする
- ハッシュ値が同じかどうかで一致を確認できるが、ハッシュ値から元のデータを読み取ることはできない
- セキュリティ用途には SHA-256 以上の強度のものを使う
注意: ハッシュは「暗号化していない」のにセキュリティに使えるのは、元に戻せないからです。ただし、よくあるパスワードのハッシュ値はあらかじめ計算されて表(レインボーテーブル)として存在します。ソルトを組み合わせることで、この表による解析を防げます。