LoginSignup
4
4

Bcryptハッシュ

Last updated at Posted at 2023-03-19

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はハッシュ化したパスワードが漏洩してしまった場合に対する対策です。
短いパスワードや、予測可能なパスワードは避け、記号やアルファベット(大文字、小文字)、数字などを組みあせた複雑なパスワードを設定することが大切です。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4