ストレッチング【パスワード】
ハッシュ化を繰り返すよ
パスワードをハッシュ化して保存するときに出てくるよ
ハッシュ値から元のパスワードを推測しにくくするのが目的だよ
簡単に書くよ
ストレッチング【パスワード】(英:stretching)とは
「パスワードをハッシュ関数
(入力されたデータをもとにして作った適当な値を返してくれる関数)に入れてハッシュ値
(ハッシュ関数から出てきた適当な値)に変換してから保管することで元のパスワードを分かりにくくするぜ!」作戦をやるときに「より元のパスワードを分かりにくくするぜ!」な目的で出てくるやつ
であり
「パスワードをハッシュ関数に入れてハッシュ値(ハッシュ値A)に変換する」→「ハッシュ値Aをハッシュ関数に入れてハッシュ値(ハッシュ値B)に変換する」→「ハッシュ値Bをハッシュ関数に入れてハッシュ値(ハッシュ値C)に変換する」→……のようにハッシュ化を繰り返すことで元のパスワードを分かりにくくすること
です。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として
・関数
・ハッシュ関数
・ハッシュ値
・ハッシュ化
について説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
関数は「何かを入れると何かをやって何かを返してくれる、処理のまとまり」です。
一般的には、入力を受けて処理をやり、その結果として出力があります。
ついでなので書いておくと、関数に入れる値は「引数(ヒキスウ)」と言います。
関数から出てくる値は「戻り値」です。
ちょっと汚い話で恐縮ですが、人間は、ご飯を食べて、ウンチを出します。
人間が関数だと考えてください。
ご飯に相当するものが引数です。
ウンチに相当するものが戻り値になります。
ハッシュ関数は「入力に対応する適当な値(適当に見える値)を返してくれる関数」です。
例えば「愛媛みかん」を入れると「3」が返ってきます。
「青森りんご」を入れると「4」が返ってきます。
「栃木苺」を入れると「とちおとめ」が返ってきたりします。
何を入れると何が返ってくるか、入れたものからは分かりません。
返ってくるのは適当な値です。
ただし、同じものを入れれば、必ず同じ値が返ってきます。
「愛媛みかん」を入れると、必ず「3」が返ってきます。
何回入れても「3」が返ってきます。
1.適当な値が返ってくる
2.同じ入力に対しては同じ値が返ってくる
というのがハッシュ関数の特徴です。
※話を単純化するために「適当な値」という表現を使っていますが、実際には適当では ありません。入力されたデータを「特定のルールに沿って」ぐちゃぐちゃにした値が返ってきます。
ハッシュ値は「ハッシュ関数から返ってくる値(戻り値)」です。
入力されたデータをもとにして作られた適当な値(適当に見える値)です。
ハッシュ値には
1.ハッシュ値から元のデータを特定するのは、ほとんど無理
2.元のデータが同じなら生成されるハッシュ値も同じ
3.元のデータが変わると生成されるハッシュ値は(ガッツリと)変わる
といった特徴があります。
「元データ→ハッシュ値」は お手軽だけど「元データ←ハッシュ値」は すっごい大変だよ、ということです。
ハッシュ化は「値をハッシュ関数に入れてハッシュ値に変換すること」です。
そのまんまと言えば、そのまんまですね。
以上を踏まえて、本題に入ります。
例えば、パスワードをデータベースの中に保管するとしましょう。
パスワードをそのままの形で保管すると、悪い人にデータベースの中身を見られたときに大変です。
パスワードがバレてしまいます。
そこで、パスワードをハッシュ関数に入れて、出てきたハッシュ値を保管しておきます。
そうすれば、悪い人にデータベースの中身を見られてもパスワードはバレません。
バレるのは「パスワードのハッシュ値」です。
入力されたパスワードが正しいかチェックするときは、入力されたパスワードをハッシュ関数に入れて、出てきたハッシュ値とデータベースに保管されているハッシュ値を比較します。
ハッシュ値が一致すれば元のパスワード同士も同じだろうと判断するわけです。
ふむ、これならパスワードをそのまま保管するより安全そうですね。
ナイスです。
このナイスなやり方を見た賢い人が、さらにナイスなやり方を考えました。
それは
ハッシュ化を繰り返すことで元の値を分かりにくくする
やり方です。
例えば、パスワードが「piyo」だとしましょう。
このパスワード「piyo」をハッシュ関数に入れてハッシュ値に変換しました。
これでもパスワードをそのまま保管するよりは安全ですが、もしもハッシュ値から元の値を割り出せてしまったら、どうでしょう。
パスワードがバレてしまいますよね。
そこで、一工夫しました。
パスワード「piyo」をハッシュ関数に入れて得たハッシュ値を、さらにハッシュ関数に入れたのです。
もし悪い人がパスワードを割り出そうとしたら、ハッシュ値から元の値を割り出して、そこから、さらに元の値を割り出す必要があります。
大変ですね。
さらにダメ押しをしておきましょう。
パスワード「piyo」をハッシュ関数に入れて得たハッシュ値をハッシュ関数に入れて得たハッシュ値を、さらにハッシュ関数に入れます。
もし悪い人がパスワードを割り出そうとしたら、ハッシュ値から元の値を割り出して、そこから、さらに元の値を割り出して、そこから、さらに元の値を割り出す必要があります。
かなり大変ですね。
さらに、さらにダメ押しをしておきましょう。
……のような感じで、100回くらいハッシュ化を繰り返したら、どうでしょう?
元の値を割り出すのがメッチャ大変になりますよね。
このように
ハッシュ化を繰り返すことで元のパスワードを割り出すのを大変にする
のが「ストレッチング」です。
ハッシュ化するのは簡単です。
ハッシュ関数に値を入れるだけです。
それに対して、ハッシュ値から元の値を割り出すのは大変です。
その大変な作業を何回も強いることで悪い人をゲンナリさせるのがストレッチングです。
なお「ストレッチング」という名前の由来は私も知りません。
気になる人は他のところで情報を補完してください。
一言でまとめるよ
まぁ「ストレッチング」って単語が出てきたら「1つの値(パスワード)に対して、ハッシュ化を繰り返すんだな~」と お考えください。
おまけ
■訳してみるよ
「stretching(ストレッチング)」は「stretch(ストレッチ)」+「ing」です。
「stretch(ストレッチ)」の意味は「伸びる」とか「伸ばす」とかです。
■検索してみる?






