Bcryptのハッシュのアルゴリズムと照合の流れ
普段何となくハッシュ化するときに使っていたBcryptについて既にたくさん記事はあると思いますが勉強ついでに記述していきます
Bcryptとは
値のハッシュ化のために設計された暗号関数でソルトと呼ばれるランダムな値をハッシュする値に追加することで、同じパスワードでも異なるハッシュ値が生成されます。
例)
-1回目-
パスワード
Test1234
Bcryptでハッシュしたパスワード
$2a$10$1wZ3atKDtHTogU1FcnBb5eHmlXgQTCkR7tyAUlmuGJTqqs8hGSMbe
-2回目-
パスワード
Test1234
Bcryptでハッシュしたパスワード
$2a$10$4WG7EEgrfw0pLliTY6qg9uZ9q/q686Fa1/aLJsSsMVl10TWf4ouLe
同じパスワードでも異なるハッシュ値が得られることが分かると思います。
Bcryptのアルゴリズム
まずはアカウント登録とログインを想定して考えていきます。
-アカウント登録-
- 入力されたpasswordにソルト(ランダムな文字列 (22文字))を追加する
- password+ソルトをハッシュ化しハッシュ値を作成する
- $2a$10$1wZ3atKDtHTogU1FcnBb5eHmlXgQTCkR7tyAUlmuGJTqqs8hGSMbeという形で生成される
$2a = bcryptのアルゴリズムバージョン(Scheme)
$10 = ハッシュ作成の際に処理される回数2^cost(Cost)
$1wZ3atKDtHTogU1FcnBb5e = ランダムな文字列22文字(salt)
HmlXgQTCkR7tyAUlmuGJTqqs8hGSMbe = password+ソルトをハッシュ化したハッシュ値
-ログイン-
- 入力されたメールアドレスと一致するデータの保存されたパスワードのソルトの値を取得
例)$2a$10$1wZ3atKDtHTogU1FcnBb5eHmlXgQTCkR7tyAUlmuGJTqqs8hGSMbeだと
$1wZ3atKDtHTogU1FcnBb5eの箇所に当たる - 入力されたパスワードとソルトを組み合わせハッシュ化を行いDBに保存されているハッシュ化されているパスワードと照合する
ソルトの役割
なぜわざわざこのようにソルトを追加してハッシュする必要があるのかと思う人もいると思います。万が一ハッシュ化された(ソルト無し)パスワードが流出してしまったとします。パスワードを見破るには事前にハッシュされた大量のデータが入ったデータベースを使用して逆算することになります。これをレインボーテーブル攻撃と言うそうです。複雑なパスワードならば簡単に見破られることはないですが簡易的なパスワードだった場合は簡単に見破られてしまう恐れがあります。
しかしbcryotを使用した場合ハッシュ値には必ずランダムな値のソルトが含まれているため、レインボーテーブル攻撃をしようにもソルト込用のハッシュ化されたデータが必要になってくるわけです。しかも毎回ハッシュ値が違うためその都度レインボーテーブル攻撃用のデータベースを作らなくていけません。これがソルトを追加する理由です
Discussion