ハッシュ化のソルトとペッパーとストレッチング # 451
最近ハッシュテーブルとかハッシュマップとかについて記事を書いていましたが、そもそもの一般的なハッシュについて理解を深めたのでメモしておきます。
ハッシュ化とは
ハッシュ化とは、元データ(文字列)をハッシュ値(文字列)に不可逆変換することを指します。意味不明な文字列に変換されるので、パスワードなど、変換前の文字列を知られたくない場合に用いられます。
ハッシュ化を実行する関数をハッシュ関数と呼びます。
参考ブログからの引用ですが、例えばmd5関数でハッシュ化すると以下のような文字列になります。
<?php
print ('ガンダム: '.md5('ガンダム')."\n");
print ('ガンキャノン: '.md5('ガンキャノン')."\n");
print ('ガンタンク: '.md5('ガンタンク')."\n");
?>
//結果
ガンダム: e87f1086f7bf9f59f1ec0b2dd2f320a4
ガンキャノン: e44e4ca716d4df9d1d4553641f77a00c
ガンタンク: 7faab3c51029273da3ee78d36e82f788
例えばユーザーのパスワードをデータベースに保存する際など、生の文字列を保存すると非常に高リスクですが、この意味不明な不可逆な文字列を保存しておけばリスクを軽減できます。
ハッシュ化を破る攻撃
ただしこの意味不明な文字列も、流出してしまえば安全とは言えません。いくつか攻撃によって元の文字列が推測されてしまう可能性があります。
レインボーテーブル
レインボーテーブルとは平文とハッシュ化後文字列の対応表です。全ての平文について対応表を作ることは困難ですが、良く使われる平文はこれで突破されてしまいます。
ブルートフォース
いわゆる総当たり攻撃です。その名の通り力づくで、費用と日数をかけて強引にハッシュ値から元の値を逆引きします。
攻撃を防ぐ手段
意図的にパスワードやハッシュ化の複雑度を高めることで、攻撃の成功率を下げることが可能です。
Solted Hash
ハッシュ化をソルトする、と言い、生の文字列に塩をかけるように特定の文字列を追加してからハッシュ化します。これにより元々の文字列と異なるハッシュ値が生成されるので、攻撃により推測されてしまうことを防げます。
ソルトする文字列は固定ではなく、ユーザーによってランダムに割り当てるのが良いとされています。
Pepper (Secret Solt)
上記のようにソルトしても、ソルトした文字列が同じデータベースに保存されていたとしたら、データベースが丸ごと流出したら意味がありません。そこでハッシュ値とは別に階層(.env等)にソルトを保存する手法をペッパー(pepper)と呼びます。
ストレッチング
まんま引用ですが、以下の通りです。
知識が広がったり深まったりすると嬉しいですね。
ここまでお読みいただきありがとうございました!!