ハッシュ

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

ハッシュ のアイキャッチ図解
まずは、こう考えるとつかみやすいです。

ハッシュは、肉をミンチにする調理に似ています。ミンチにする前の形には戻せませんが、同じ肉を同じ機械でミンチにすれば必ず同じ状態になります。

ひとことで言うと

ハッシュは、任意のデータを決まった長さの値(ハッシュ値)に変換する一方向の処理で、元のデータに戻すことができないことが特徴です。

同じデータを入力すれば必ず同じハッシュ値が出力されます。 少しでも内容が違えばハッシュ値は大きく変わります。 この性質を使って、パスワードの保管やデータの改ざん検出に広く使われています。

たとえ話でもう少し詳しく

ハッシュは、肉をミンチにする調理に近いです。

  • どんな形の肉でも、同じ機械を通せば同じ見た目のミンチになる
  • ミンチにした肉を元の形に戻すことはできない
  • 同じ肉を同じ機械に通せば、毎回同じミンチが出てくる

ハッシュ関数も同じです。 「password123」というテキストをハッシュ関数に通すと「ef92b778…」のような固定長の値が出ます。 元の文字列には戻せませんが、「password123」を入れれば必ず同じ値が出るので、「一致するかどうか」を比較できます。

よく出る場面・使いどころ

  • パスワードの保存(パスワードそのものではなくハッシュ値を保管する)
  • ファイルが改ざんされていないかの確認(ダウンロードしたファイルのハッシュ値を公開値と照合する)
  • デジタル署名の仕組み(大きなデータのハッシュ値に署名することで効率化)
  • ブロックチェーンの連鎖構造(前のブロックのハッシュを次のブロックに含める)

似た言葉との違い

  • 暗号化
    • 正しい鍵を使えば元のデータに戻せる(可逆的)
    • ハッシュは元に戻すことを想定しない(不可逆的)
  • エンコーディング
    • 決まったルールで変換するが、逆変換で元に戻せる
    • ハッシュは逆変換ができない点が根本的に異なる
  • チェックサム
    • データの誤りを検出するための検査値
    • ハッシュの用途の一つ。ハッシュ関数を使ってチェックサムを生成することが多い

実務で気にするポイント

  • 古いハッシュ関数(MD5・SHA-1)は衝突(異なるデータが同じハッシュ値になる)が見つかっており、セキュリティ用途には使わない
  • パスワードのハッシュには「ソルト(ランダムな値を加えてからハッシュする処理)」を組み合わせ、同じパスワードでも違うハッシュ値になるようにする
  • ハッシュ値が同じかどうかで一致を確認できるが、ハッシュ値から元のデータを読み取ることはできない
  • セキュリティ用途には SHA-256 以上の強度のものを使う

注意: ハッシュは「暗号化していない」のにセキュリティに使えるのは、元に戻せないからです。ただし、よくあるパスワードのハッシュ値はあらかじめ計算されて表(レインボーテーブル)として存在します。ソルトを組み合わせることで、この表による解析を防げます。