元に戻さず同じデータか確かめるハッシュ

ハッシュは、データを一定の長さの値(ハッシュ値)に変換する処理で、元のデータに戻すことを想定していない一方向の変換です。

ミンチは元の肉には戻らない

肉をミンチにすると、元の塊の形には戻せません。でも、同じ肉を同じ機械に通せば、毎回同じミンチが出てきます。ハッシュは、この性質をデータで実現する処理です。どんなデータでも決まった長さの値(ハッシュ値)に変換し、その値から元のデータを復元することはできません。

「password123」という文字列をハッシュ関数に通すと、「ef92b778…」のような決まった長さの値が出てきます。元の文字列には戻せませんが、同じ「password123」を入れれば必ず同じ値が出る。そして中身が1文字でも違えば、ハッシュ値は大きく変わります。だから、ハッシュ値どうしを比べれば、元のデータを見なくても「同じものかどうか」が分かります。

鍵を使えば元に戻せる暗号化や、決まった表で誰でも戻せるエンコーディングとは、ここが根本的に違います。3つの言葉の違いはエンコード・ハッシュ・暗号化の違いで整理しています。

照合札として使われている場所

  • パスワードの保存。パスワードそのものではなく、ハッシュ値を保管しておき、ログインのたびに入力されたもののハッシュ値と比べる
  • ダウンロードしたファイルの確認。配布元が公開しているハッシュ値と照らし合わせて、途中で改ざんされていないかを確かめる
  • デジタル署名。大きなデータそのものではなく、そのハッシュ値に署名して処理を軽くする
  • ブロックチェーン。前のブロックのハッシュ値を次のブロックに含めて、鎖のようにつなぐ

データの誤りを見つけるためのチェックサムも、ハッシュ関数で作られることが多い検査値です。

パスワードの保存で気をつけること

元に戻せないなら安全、とは言い切れません。よく使われるパスワードについては、そのハッシュ値をあらかじめ計算した対応表(レインボーテーブル)が出回っています。ハッシュ値が漏れれば、表を引くだけで元のパスワードが分かってしまいます。

これを防ぐのがソルトです。パスワードにランダムな値を加えてからハッシュにすることで、同じパスワードでも人ごとに違うハッシュ値になり、対応表が使えなくなります。

使うハッシュ関数も選びます。MD5 や SHA-1 は、違うデータから同じハッシュ値が作れてしまう「衝突」が見つかっているため、セキュリティ用途には使いません。SHA-256 以上の強度のものを選んでください。