ミンチは元の肉には戻らない
肉をミンチにすると、元の塊の形には戻せません。でも、同じ肉を同じ機械に通せば、毎回同じミンチが出てきます。ハッシュは、この性質をデータで実現する処理です。どんなデータでも決まった長さの値(ハッシュ値)に変換し、その値から元のデータを復元することはできません。
「password123」という文字列をハッシュ関数に通すと、「ef92b778…」のような決まった長さの値が出てきます。元の文字列には戻せませんが、同じ「password123」を入れれば必ず同じ値が出る。そして中身が1文字でも違えば、ハッシュ値は大きく変わります。だから、ハッシュ値どうしを比べれば、元のデータを見なくても「同じものかどうか」が分かります。
鍵を使えば元に戻せる暗号化や、決まった表で誰でも戻せるエンコーディングとは、ここが根本的に違います。3つの言葉の違いはエンコード・ハッシュ・暗号化の違いで整理しています。
照合札として使われている場所
- パスワードの保存。パスワードそのものではなく、ハッシュ値を保管しておき、ログインのたびに入力されたもののハッシュ値と比べる
- ダウンロードしたファイルの確認。配布元が公開しているハッシュ値と照らし合わせて、途中で改ざんされていないかを確かめる
- デジタル署名。大きなデータそのものではなく、そのハッシュ値に署名して処理を軽くする
- ブロックチェーン。前のブロックのハッシュ値を次のブロックに含めて、鎖のようにつなぐ
データの誤りを見つけるためのチェックサムも、ハッシュ関数で作られることが多い検査値です。
パスワードの保存で気をつけること
元に戻せないなら安全、とは言い切れません。よく使われるパスワードについては、そのハッシュ値をあらかじめ計算した対応表(レインボーテーブル)が出回っています。ハッシュ値が漏れれば、表を引くだけで元のパスワードが分かってしまいます。
これを防ぐのがソルトです。パスワードにランダムな値を加えてからハッシュにすることで、同じパスワードでも人ごとに違うハッシュ値になり、対応表が使えなくなります。
使うハッシュ関数も選びます。MD5 や SHA-1 は、違うデータから同じハッシュ値が作れてしまう「衝突」が見つかっているため、セキュリティ用途には使いません。SHA-256 以上の強度のものを選んでください。