「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

一方向ハッシュ関数

pointこの用語のポイント

pointハッシュ関数だよ

pointセキュリティ関係で使われるよ

スポンサーリンク

簡単に書くよ

一方向ハッシュ関数(読:イチホウコウハッシュカンスウ 英:one-way hash function)とは

「暗号的ハッシュ関数」のこと。
用語の中身としては

入力されたデータをもとにして作った適当な値を返してくれる関数(処理のまとまり)(ハッシュ関数)の分類のひとつ
であり

デジタル署名とかのセキュリティ分野で使われるハッシュ関数のこと
です。


image piyo

詳しく書くよ

順番に見ていきましょう。
まずは予備知識として

関数
一方向性関数
ハッシュ関数
暗号的ハッシュ関数


について説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。

関数は「何かを入れると何かをやって何かを返してくれる、処理のまとまり」です。
一般的には、入力を受けて処理をやり、その結果として出力があります。

一方向ハッシュ関数

ついでなので書いておくと、関数に入れる値は「引数(ヒキスウ)」と言います。

一方向ハッシュ関数2

関数から出てくる値は「戻り値」です。

一方向ハッシュ関数3

ちょっと汚い話で恐縮ですが、人間は、ご飯を食べて、ウンチを出します。

一方向ハッシュ関数4

人間が関数だと考えてください。
ご飯に相当するものが引数です。
ウンチに相当するものが戻り値になります。

一方向ハッシュ関数5

一方向性関数は「出力を見ても入力が何か分からない関数」です。
言い方を変えると

戻り値を見ても引数が推測できない関数

です。

先ほどの例で言えば、ウンチを見て「ん?この粒は……さてはトウモロコシを食べたな!」のような推測ができれば一方向性関数では ありません。

一方向ハッシュ関数6

ウンチを見ても「う~ん、何を食べたか分からないなぁ」と食べたものが推測できなければ一方向性関数です。

一方向ハッシュ関数7

ハッシュ関数は「入力に対応する適当な値(適当に見える値)を返してくれる関数」です。

例えば、ハッシュ関数に「愛媛みかん」を入れると「3」が返ってくるとしましょう。
同じように「青森りんご」を入れると「4」が返ってきます。
「栃木苺」を入れた場合は「5」が返ってきます。

一方向ハッシュ関数8

ハッシュ関数は同じ物を入れれば必ず同じ値が返ってきます。

「愛媛みかん」を入れた場合に返ってくるのは、必ず「3」です。
何回入れても「3」が返ってきます。
「4」が返ってくることは ありません。

一方向ハッシュ関数9

ハッシュ関数には

1.適当な値が返ってくる
2.同じ入力に対しては同じ値が返ってくる


という特徴があります。
※話を単純化するために「適当な値」という表現を使っていますが、実際には適当では ありません。入力されたデータを「特定のルールに沿って」ぐちゃぐちゃにした値が返ってきます。

さて、このハッシュ関数ですが、世の中に1つしかないわけでは ありません。
いろいろな種類のハッシュ関数があります。

例えば、返してくれる値(適当な値)の作り方が違ったりですね。
あるいは、返してくれる値の桁数が違ったりですね。
一口に「ハッシュ関数」と言っても、いくつかの種類があるのです。

暗号的ハッシュ関数は「セキュリティ関係で使われる(ことを想定して作られた)ハッシュ関数」です。

一方向ハッシュ関数10

例えば「デジタル署名」という仕組みでは、ハッシュ関数を使って、あれやこれやします。
そのようなセキュリティ用途で使われるハッシュ関数です。

暗号的ハッシュ関数もハッシュ関数です。
よって

1.適当な値が返ってくる
2.同じ入力に対しては同じ値が返ってくる


という特徴があります。

それに加えて

1.入力値がちょっと変わるとハッシュ値出力値はガッツリ変わる
2.ハッシュ値から元の値(入力値)を割り出すのがスゴい大変
3.入力値の長さが違ってもハッシュ値の長さ(桁数)は同じになる
4.同じハッシュ値になる2つの入力値を見つけるのがメッチャ大変


のような特徴があります。

以上を踏まえて

暗号的ハッシュ関数の別の呼び名

が「一方向ハッシュ関数」です。

一方向ハッシュ関数11

個人的には、少し違和感を覚える呼び名ですけどね。

おそらく「厳密に考えれば、ハッシュ関数の定義には一方向性を含まない(出力値から入力値を求められてもハッシュ関数としては成立する)」ということなのでしょうが、私は「ハッシュ関数」と言われたら出力値から入力値を求めるのがメッチャ大変なやつを思い浮かべます。
「えっ?ハッシュ関数って時点で一方向性があるんじゃないの?なんで、わざわざ『一方向』って付けるの?」と疑問を覚えてる人が出てきても不思議はない気がします。

ということで、そこら辺のあれこれを突き詰めて考えると混乱しかねません。
あまり難しいことは考えず「『暗号的ハッシュ関数』と『一方向ハッシュ関数』は同じやつ!」と暗記してしまった方が無難だと思います。


image piyo2

一言でまとめるよ

まぁ「一方向ハッシュ関数」って単語が出てきたら「セキュリティ用途のハッシュ関数(入力されたデータをもとにして作った適当な値を返してくれる関数)なんだな~」と お考えください。

一番上に戻るよ
スポンサーリンク
書籍画像026
書籍画像057

おまけ

■訳してみるよ

「一方向」は日本語ですね。
「hash(ハッシュ)」は「ハッシュドポテト」の「ハッシュ」です。
意味は「切り刻む」とか「細切れにする」とか「薄切りにする」とか「寄せ集め」とか「ごちゃまぜ」とかです。
「関数」は日本語です。
何となく くっつけると

一方向の(値を)細切れにする関数

となります。





書籍画像
わわわ説明術コラム
宣伝だよ
つくって、壊して、直して学ぶ Git&GitHub 入門
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本【Audible】
ソフトウェア受託現場の「失敗」集めてみた。 42の失敗事例で学ぶ受託開発のうまい進めかた