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