ハッシュ関数
何のことか
米国立標準技術研究所(NIST)の用語集は、ハッシュ関数をこう定義しています[1]。
A function that maps a bit string of arbitrary length to a fixed-length bit string
(任意の長さのビット列を、決まった長さのビット列に対応づける関数)
1文字のデータでも、大きなファイルでも、出てくる値の長さは同じです。この出てきた値をハッシュ値と呼びます。同じ用語集は、ハッシュ値を「メッセージにハッシュ関数を適用した結果」(The result of applying a hash function to a message)としています[2]。
どんな性質があるのか
NIST の用語集が挙げる定義から、主な性質を3つ拾います[1]。
- 内容全体で決まる: 値は「ファイルやメッセージの内容全体に左右される」(depends on the entire contents of the file or message)。用語集は、ハッシュ関数を「ファイルやメッセージの指紋のようなもの」(A hash function can be considered to be a fingerprint of the file or message)と考えられる、と書いています。
- 元に戻せない(一方向性): 「無作為に選ばれた出力が与えられたとき、その出力になる入力を見つけることは計算上実行できない」(Given a randomly chosen target output, it is computationally infeasible to find any input that maps to that output)。用語集は「この性質は一方向性と呼ばれる」(This property is called the one-way property)としています。
- ぶつからない(衝突しにくい): 「同じ出力になる2つの異なる入力を見つけることは計算上実行できない」(It is computationally infeasible to find any two distinct inputs that map to the same output)。
よくある誤解:暗号化と同じものか
同じではありません。総務省の用語集は、暗号化したデータを戻すこと(復号)を「暗号化されたデータを元に戻して、人やコンピュータが識別できる情報にすること。」と説明しています[4]。暗号化したデータは、この復号で元に戻せます。これに対してハッシュ関数は、上のとおり出力から入力を見つけられないように作られています。「元に戻す」使い方をしないのがハッシュ関数です。
ニュースで読むときの注意
情報漏えいの発表では、「パスワードのハッシュ値」「ハッシュ化したパスワード」という言い方がよく出てきます(例:「銀のさら」など3ブランドの漏えい、ファンケルとアテニアの漏えい)。これは、漏れたのがパスワードの文字列そのものではなく、ハッシュ関数を通した結果だった、という意味です。
ハッシュ値に関わる言葉として、NIST の用語集にはソルト(salt)もあります。「暗号の処理で使う、秘密ではない値。通常は、ある1件について行った計算の結果を、攻撃者が使い回せないようにするためのもの」(A non-secret value used in a cryptographic process, usually to ensure that the results of computations for one instance cannot be reused by an attacker)という定義です[3]。
同じパスワードを別のサービスでも使っていた場合については、総務省が「サービスから流出したアカウント情報を使って、他のサービスへの不正ログインを試す攻撃の手口が知られています。」と注意しています[5]。使い回したパスワードは「他のサービスから何らかの原因でパスワードが漏洩してしまえば、第三者に重要情報にアクセスされてしまう可能性があります。」とも書いています[5](情報漏えい、多要素認証)。
材料を全部ミキサーにかけて作ったスムージーのようなものです。同じ材料を同じ量入れれば、毎回同じ味になります。材料が1つ違えば味が変わります。でも、できあがったスムージーから元の果物を取り出して並べ直すことはできません。