一方向ハッシュ関数
ハッシュ関数だよ
セキュリティ関係で使われるよ
簡単に書くよ
一方向ハッシュ関数(読:イチホウコウハッシュカンスウ 英:one-way hash function)とは
「暗号的ハッシュ関数」のこと。
用語の中身としては
入力されたデータをもとにして作った適当な値を返してくれる関数
(処理のまとまり)(ハッシュ関数)の分類のひとつ
であり
デジタル署名とかのセキュリティ分野で使われるハッシュ関数のこと
です。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として
・関数
・一方向性関数
・ハッシュ関数
・暗号的ハッシュ関数
について説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
関数は「何かを入れると何かをやって何かを返してくれる、処理のまとまり」です。
一般的には、入力を受けて処理をやり、その結果として出力があります。
ついでなので書いておくと、関数に入れる値は「引数(ヒキスウ)」と言います。
関数から出てくる値は「戻り値」です。
ちょっと汚い話で恐縮ですが、人間は、ご飯を食べて、ウンチを出します。
人間が関数だと考えてください。
ご飯に相当するものが引数です。
ウンチに相当するものが戻り値になります。
一方向性関数は「出力を見ても入力が何か分からない関数」です。
言い方を変えると
戻り値を見ても引数が推測できない関数
です。
先ほどの例で言えば、ウンチを見て「ん?この粒は……さてはトウモロコシを食べたな!」のような推測ができれば一方向性関数では ありません。
ウンチを見ても「う~ん、何を食べたか分からないなぁ」と食べたものが推測できなければ一方向性関数です。
ハッシュ関数は「入力に対応する適当な値(適当に見える値)を返してくれる関数」です。
例えば、ハッシュ関数に「愛媛みかん」を入れると「3」が返ってくるとしましょう。
同じように「青森りんご」を入れると「4」が返ってきます。
「栃木苺」を入れた場合は「5」が返ってきます。
ハッシュ関数は同じ物を入れれば必ず同じ値が返ってきます。
「愛媛みかん」を入れた場合に返ってくるのは、必ず「3」です。
何回入れても「3」が返ってきます。
「4」が返ってくることは ありません。
ハッシュ関数には
1.適当な値が返ってくる
2.同じ入力に対しては同じ値が返ってくる
という特徴があります。
※話を単純化するために「適当な値」という表現を使っていますが、実際には適当では ありません。入力されたデータを「特定のルールに沿って」ぐちゃぐちゃにした値が返ってきます。
さて、このハッシュ関数ですが、世の中に1つしかないわけでは ありません。
いろいろな種類のハッシュ関数があります。
例えば、返してくれる値(適当な値)の作り方が違ったりですね。
あるいは、返してくれる値の桁数が違ったりですね。
一口に「ハッシュ関数」と言っても、いくつかの種類があるのです。
暗号的ハッシュ関数は「セキュリティ関係で使われる(ことを想定して作られた)ハッシュ関数」です。
例えば「デジタル署名」という仕組みでは、ハッシュ関数を使って、あれやこれやします。
そのようなセキュリティ用途で使われるハッシュ関数です。
暗号的ハッシュ関数もハッシュ関数です。
よって
1.適当な値が返ってくる
2.同じ入力に対しては同じ値が返ってくる
という特徴があります。
それに加えて
1.入力値がちょっと変わるとハッシュ値(出力値)はガッツリ変わる
2.ハッシュ値から元の値(入力値)を割り出すのがスゴい大変
3.入力値の長さが違ってもハッシュ値の長さ(桁数)は同じになる
4.同じハッシュ値になる2つの入力値を見つけるのがメッチャ大変
のような特徴があります。
以上を踏まえて
暗号的ハッシュ関数の別の呼び名
が「一方向ハッシュ関数」です。
個人的には、少し違和感を覚える呼び名ですけどね。
おそらく「厳密に考えれば、ハッシュ関数の定義には一方向性を含まない(出力値から入力値を求められてもハッシュ関数としては成立する)」ということなのでしょうが、私は「ハッシュ関数」と言われたら出力値から入力値を求めるのがメッチャ大変なやつを思い浮かべます。
「えっ?ハッシュ関数って時点で一方向性があるんじゃないの?なんで、わざわざ『一方向』って付けるの?」と疑問を覚えてる人が出てきても不思議はない気がします。
ということで、そこら辺のあれこれを突き詰めて考えると混乱しかねません。
あまり難しいことは考えず「『暗号的ハッシュ関数』と『一方向ハッシュ関数』は同じやつ!」と暗記してしまった方が無難だと思います。
一言でまとめるよ
まぁ「一方向ハッシュ関数」って単語が出てきたら「セキュリティ用途のハッシュ関数
(入力されたデータをもとにして作った適当な値を返してくれる関数)なんだな~」と お考えください。
おまけ
■訳してみるよ
「一方向」は日本語ですね。
「hash(ハッシュ)」は「ハッシュドポテト」の「ハッシュ」です。
意味は「切り刻む」とか「細切れにする」とか「薄切りにする」とか「寄せ集め」とか「ごちゃまぜ」とかです。
「関数」は日本語です。
何となく くっつけると
一方向の(値を)細切れにする関数
となります。
■検索してみる?






