ハッシュ関数

読み:はっしゅかんすう / 英語表記:hash function

任意の長さのデータから、固定長の値(ハッシュ値)を計算する関数。セキュリティで使う暗号学的ハッシュ関数では、ハッシュ値から元のデータを求めることや、同じハッシュ値になる別のデータを見つけることが、事実上できない。

イマシルちゃんの解説

ハッシュ関数は、データの「指紋」を取る機械みたいなものなんだ。

どんなに長い文章でも、機械に入れると、決まった長さの短い指紋が出てくる。
元の文章が1文字でも変わると、指紋はまったく別物になっちゃうんだよ。
だから、指紋を比べるだけで、データが書き換えられていないかを確かめられるんだ!

より深い解説

定義

ハッシュ関数は、入力のデータの長さに関係なく、一定の長さの出力(ハッシュ値、メッセージダイジェスト)を返す関数である。同じ入力からは、必ず同じハッシュ値が得られる。

暗号学的ハッシュ関数に求められる性質

性質内容
原像計算困難性(一方向性)ハッシュ値から、元のデータを求めることが難しい
第2原像計算困難性あるデータと同じハッシュ値になる、別のデータを見つけることが難しい
衝突困難性同じハッシュ値になる、任意の2つのデータの組を見つけることが難しい

また、入力が1ビット変わるだけで、ハッシュ値が大きく(約半分のビットが)変わる性質(雪崩効果)を持つ。

代表的なハッシュ関数

名前ハッシュ値の長さ状況
MD5128ビット衝突が現実的に見つけられるため、セキュリティ用途では使わない
SHA-1160ビット衝突が実証されており、新しいシステムでは使わない
SHA-256256ビットSHA-2の一種。現在広く使われている
SHA-3224~512ビットSHA-2とは異なる構造で作られた新しい標準

主な用途

用途内容
改ざんの検出ファイルのハッシュ値を記録・公開しておき、後で比較する(コンペア法、ダウンロードしたファイルの確認)
デジタル署名データそのものではなく、そのハッシュ値に署名する
パスワードの保存パスワードそのものではなく、ソルトを加えたハッシュ値を保存する
メッセージ認証共通の鍵とハッシュ関数を組み合わせて、メッセージ認証コード(HMAC)を作る
ブロックチェーン前のブロックのハッシュ値を次のブロックに含めて、改ざんを困難にする

暗号化との違い

ハッシュ関数暗号化
元に戻せるか戻せない(一方向)鍵があれば戻せる(復号)
出力の長さ入力にかかわらず固定入力の長さに応じて変わる
鍵使わない使う

ハッシュ値は元に戻せないため、「データを秘密にする」目的ではなく、「データが同じかどうかを確かめる」目的で使う。

パスワードの保存での注意

パスワードのハッシュ値を保存していても、よく使われるパスワードのハッシュ値をあらかじめ計算した表(レインボーテーブル)を使えば、元のパスワードを推測される。これを防ぐため、利用者ごとにランダムな値(ソルト)をパスワードに加えてからハッシュ値を計算し、さらに、計算に時間がかかるように設計された関数(bcrypt、Argon2など)を使って、総当たりを難しくする。

実際の試験ではここに出る!

この用語が出てくる記事

↑