spring securityを学習している中で、使用されているハッシュ化アルゴリズム「Bcrypt」について調べたのでメモ
Bcryptとは
パスワードのハッシュ化手法のひとつ。
「暗号化」とは異なります。暗号化の場合は「復号」することが可能ですが、ハッシュ化は「復号」はできません。
BCryptを使用したハッシュ値の例(passwordをハッシュ化)
$2a$08$isRjA7vCYFZ5GCNGwGlQ5u5aP65dNojiQ6/pMeLajNAqlHphGue6C
- 「$2a」はハッシュアルゴリズムのバージョン
- 「$08」はストレッチング回数
- その後の22文字はハッシュ化に使用する文字列です。
Bcryptではこの文字列をランダムに生成しています。(ソルトという) - 最後の31文字が結果のハッシュ値です
Bcryptがなぜ安全性が高いのか
理由1:ソルトであること(ハッシュ化に使用する文字列がランダムであること)。
理由2:ストレッチング回数を任意の回数を指定することができること
どんな攻撃に対する対策なのか
- 「レインボーテーブル攻撃」
- 「ブルートフォース攻撃」
に対する対策といえます。
レインボーテーブル攻撃とは
あらかじめ、ハッシュ化前のパスワードとハッシュ化したパスワードの一覧(テーブル)を用意しておき、漏洩したハッシュ化されたパスワードから元のパスワードを解読する攻撃手法です。
仮にパスワードのハッシュ化が固定値を使用したハッシュ化の場合、レインボーテーブルから解読されてしまう可能性が高くなります。
ハッシュ化に使用する文字列がランダム(ソルト)のため、あらかじめハッシュ化した一覧を用意することが困難となります。
ブルートフォース攻撃
総当たり攻撃です。ハッシュ化したパスワードが漏洩してしまうと、使用されている「ソルト」も判明してしまうため、単純にソルトを使用したハッシュ化のみの場合、総当たり攻撃によってパスワードを解読されてしまう可能性が高くなります。(解読するのに要する時間が短くてすむ)
ストレッチング回数はハッシュ化を実施する回数です。
2のn乗繰り返されます。上記例では8を指定しているので、256回ハッシュ化を繰り返しています。
推奨は10(1024)以上とされているようです。
ストレッチング回数は多い方がパスワード解読に要する時間が多くなります。
これにより、事実上パスワード解読が不可となる時間がかかることとなります。
※多い方が安全性は高くなりますが、その分サーバへの負荷は高くなるので、充分な考慮が必要です。
上記理由により、Bcryptは安全性が高いハッシュ化手法なんだと思います。
注意
ここでいう「ブルートフォース攻撃」とは、漏洩したハッシュ化されたパスワードから、ハッシュ化前のパスワードを解読する際のことです。
ログイン認証に対して直接ログインを可能かを実施する「ブルートフォース攻撃」とは異なります。
ログイン認証に対する「ブルートフォース攻撃」への有効な対策は規定回数パスワードを誤った場合は一定時間ロックする等となります。
また、Bcryptはハッシュ化したパスワードが漏洩してしまった場合に対する対策です。
短いパスワードや、予測可能なパスワードは避け、記号やアルファベット(大文字、小文字)、数字などを組みあせた複雑なパスワードを設定することが大切です。