パスワードのハッシュ化とSALTに関するメモ

まず前提として、ハッシュ化とは不可逆変換の事。なので、パスワードのハッシュ化は復号しない・出来ない前提の物。(パスワードの暗号化という言い方は間違いになる)

パスワードのハッシュ化は、ハッシュアルゴリズム(md5,sha1,sha2等)を使ってランダムに見える値に変換する行為。前述の通りハッシュ化は不可逆変換で、ハッシュアルゴリズムで変換された値は真正面から復号するのは非常に困難。

ただし、「よくあるパスワードとハッシュ化後の値の対応表」を事前に用意しておき、そこから検索するという手法がある。(レインボーテーブルという手法が正確には違うが大枠そういう手法)

対応表による解析の対策がSALT。ざっくり言うと、ランダムな文字列をパスワードに結合した上で、結合した文字列をハッシュ化する手法。

SALTを用いてハッシュ化した結果の例は以下。(PHPのpasword_hashの結果)

$2y$10$XjfAtRDfO32a2JaSwcCvZeS.NZLn5H8FloFhGlcFm7XN44pj15.Jm

ここで注意なのが、「SALTも含めハッシュ化に関する情報は全てこの中に含まれている」ということ。$2y$ がハッシュ関数、$10$がハッシュ関数の実行回数、それ以降がSALT及びSALTとパスワードから計算されたハッシュ値。情報が全て含まれているので、「情報にあるハッシュ関数、実行回数、SALTを適用した場合の対応表」を作ればレインボーテーブルによる解析は可能。

「じゃあSALT意味ないのでは?」って疑問が出てくるけど、SALTの目的は各パスワードの解析に時間がかかるようにして被害が広がりにくくするのが主目的。

パスワードが含まれているテーブルを盗んだとしても、レコード毎にSALTが異なるので1レコード解析する毎に「そのレコードのSALTにおけるレインボーテーブル」を用意する必要が出てくる。これには非常に時間がかかる。SALTで時間を稼いで、その間に漏洩の周知をする等被害を抑える施策を行う。

参考

https://qiita.com/rana_kualu/items/3ef57485be1103362f56

https://blog.ohgaki.net/password_hashing

https://dev.classmethod.jp/security/rainbowtable/