ハッシュ関数(hash function)
- テクノロジ系
- セキュリティ
- 基本情報
- 応用情報
- 重要度 ★★★★☆
どんな長さのデータからも決まった長さの値を作る関数。値から元へは戻せない。
もう少し詳しい説明
ハッシュ関数は、どんなデータからでも、決まった長さの値を作り出す計算です。作られた値をハッシュ値と呼びます。
大事な性質は2つあります。順番に見ていきます。
性質①:出てくる値の長さは変わらない
入れるデータが3文字でも、本1冊ぶんでも、出てくる値の長さは同じです。
よく使われる SHA-256 という関数なら、何を入れても256ビット(16進数で64文字)の値が出ます。名前の「256」がその長さを表しています。
もう1つ大事なのは、1文字でも違えば、出てくる値はまったく別のものになるという点です。「少し似た値」にはなりません。だから、データが途中で書き換えられたかどうかを、値を比べるだけで確かめられます。
性質②:値から元には戻せない
計算は一方通行です。
データからハッシュ値は簡単に計算できますが、ハッシュ値からもとのデータを求めることはできません。情報を圧縮しているのではなく、捨てているからです。本1冊を64文字に押し込めたのではなく、本1冊から64文字ぶんの特徴だけを取り出して、残りは捨てている、と考えてください。
この性質があるので、パスワードはそのものではなくハッシュ値のほうを保存します。仮にデータが盗まれても、そこにあるのは値だけで、元のパスワードは分かりません。利用者がログインするときは、入力されたパスワードから同じ計算をして、保存してある値と一致するかを見ます。
衝突:同じ値が出ることはありうる
入れられるデータは無限にあるのに、出てくる値の種類は有限です。ということは、別のデータから同じ値が出ることは理屈のうえでは必ずあります。これを衝突と呼びます。
「絶対に起こらない」と書いてある選択肢は誤りなので、ここは注意してください。実際に安全性を支えているのは、「衝突が起きない」ことではなく、衝突するデータを狙って見つけるのが極めて難しいことです。
かつて使われていた MD5 や SHA-1 は、この「狙って見つける」方法が見つかってしまったため、いまは使うべきでないとされています。現在の主流は SHA-256 です。
ソルト:同じパスワードを見破らせない
パスワードをハッシュ値で保存すると書きましたが、これだけでは足りません。同じパスワードを使っている人は、同じハッシュ値になってしまうからです。
よく使われるパスワードのハッシュ値を並べた一覧をあらかじめ用意しておけば、値を照合するだけで元のパスワードが分かってしまいます。そこで、パスワードに利用者ごとの使い捨ての文字列を足してから計算します。これをソルトと呼びます。同じパスワードでも人ごとに違う値になるので、一覧との照合が効かなくなります。
ソルト(salt)は塩のことです。名付けた人がはっきりしているわけではありませんが、料理の塩をひとつまみ足すと味が変わるように、少し足すだけで出てくる値がまったく別物になるところから来ている、というのが広く受け入れられている説明です。「同じ材料でも、ひと振りで別の仕上がりになる」と思っておくと、何のために足すのかを忘れずに済みます。
試験ではこう出る
科目A(旧・午前)のセキュリティ分野で頻出です。多いのは、ハッシュ関数の性質として正しい説明を選ばせる形で、「出力の長さが一定」「元に戻せない」の2点が軸になります。パスワードの保存方法や、デジタル署名の手順の中で問われることもあります。応用情報では、ソルトの目的や、衝突が見つかった関数を使い続ける危険まで踏み込みます。
引っかけになりやすいのは、**「衝突は絶対に起こらない」という書き方と、「暗号化の一種で復号できる」**という書き方です。どちらも誤りで、衝突は起こりうるし、ハッシュ化は暗号化ではありません。暗号化は元に戻すことを前提にした仕組み、ハッシュ化は戻せないことに意味がある仕組み、と役割で分けて覚えると混ざりません。
関連する用語
- デジタル署名
- 署名はハッシュ値に対して作る。本文そのものに署名しないのは、本文が長いため
- 公開鍵暗号方式
- 暗号化と復号で別の鍵を使う方式。署名では、この鍵をハッシュ値に対して使う
- ソルト
- パスワードに足す使い捨ての文字列。同じパスワードでも違うハッシュ値にするため
- 衝突
- 別のデータから同じハッシュ値が出てしまうこと。起こりにくいことが安全の根拠
- インデックス
- 検索を速くする索引。ハッシュ値を使って置き場所を決める方式もある
- SHA-256
- いま広く使われているハッシュ関数。名前の256は出てくる値のビット数
ミニクイズ
ハッシュ関数の性質として、最も適切なものはどれか。
正解は 1番:入力の長さにかかわらず出力の長さは一定で、出力から入力を求めることは困難である
ハッシュ関数は、3文字でも本1冊ぶんでも、出てくる値の長さは同じです。そして計算は一方通行で、値から元のデータを求めることはできません。この2つが基本の性質です。同じ入力からは必ず同じ値が出るので、実行のたびに変わることはありません。むしろ毎回変わってしまうと、比べて改ざんを見つけることができなくなります。また、入力は無限にあるのに出力の種類は有限なので、別のデータから同じ値が出ること自体は理論上ありえます。これを衝突と呼び、実用上は「見つけるのが極めて難しい」ことが安全性の根拠になっています。
最終更新:2026-09-15