Spring Securityで使われているBCryptPasswordEncoderの仕組み




BCryptpasswordEncodeを使ったパスワードのハッシュ化

Spring Securityの設定を書いているクラスに下記Beanを設定するだけで自動的に使用できます。これを定義することでbcryptの仕様に沿ってユーザ作成時のパスワードをハッシュ化することができます。

@EnableWebSecurity
class SecurityConfig : WebSecurityConfigurerAdapter() {

    @Bean
    fun passwordEncoder(): PasswordEncoder {
        return BCryptPasswordEncoder()
    }
}

bcryptとは?

認証で使用するパスワードを安全にハッシュ化するアルゴリズムです。ハッシュと聞くとSHA256がよく使われていそうですが、パスワードのハッシュ化に関してはSHA256は安全ではないみたいです。

自分がセキュリティに関して詳しくないのでうまく説明できませんが、ハッシュというのは簡単に何回も計算できるからハイスペックなPCを使えば簡単に突破できるよということみたいです。この問題点をbcryptは解決してくれるみたいですね。

Hash関数アルゴリズムは(元々高速に計算することを意図していたのもあり)非常に高速に計算が可能であり、総当たり試行されてしまえば、現代のコンピュータスペックをもってすれば一瞬で解読されてしまいます。また、レインボーテーブルと呼ばれる、高速にHashから元の値を類推することが可能なアルゴリズムも存在し、Hash化では不足です。

参考:BCryptのすすめ

bcrypt詳細

bcryptは60文字のハッシュ値を生成します。このハッシュ値の中には次の4つの情報が含まれます。

  • bcryptのバージョン
  • ストレッチング回数(ハッシュ化の回数で、2のn乗のnのことで4~31を指定できる)
  • ソルト値
  • ハッシュ値

例えば下記ハッシュ値の場合を4つに分けると表のようになります。

$2a$10$E5J7SFVBbzynwgKPazA69uNN9lpn6zHq5om6a51FuoTqxo9KsxQHG

要素 実際の文字列 範囲
バージョン情報 $2 最初の$の後
ストレッチング回数 $10 2番目の$の後
ソルト値 $E5J7SFVBbzynwgKPazA69 3番目の$の後
実際のハッシュ値 uNN9lpn6zHq5om6a51FuoTqxo9KsxQHG 30文字目から最後まで

バージョン情報、ストレッチ回数、ソルト回数が入っていて何がいいのかというと、途中からbcryptのバージョンとストレッチング回数を上げても全く問題ないし、ソルト値もDBの別カラムで管理しないでいいのが楽でいいですよね。

サーバーのスペックがより安価に手に入るようになったら今よりもストレッチング回数を上げてよりセキュアなハッシュ値にすることが簡単にできます。

まとめ

今まではパスワードはハッシュ化しとけばいいだろうという感覚でしたかなかったのでbcryptというものがより安全にハッシュ化しているということを学べてよかった。

パスワードのハッシュ化についてあまりちゃんと考えたことがなかったの良い機会となりました。こうやって何気なく使っている技術のことも調べる癖をつけていきたいですね。

おすすめ書籍

Springの概要からインストール方法、各コア機能(Security, Sessionなど)の解説が体系的にまとめられています。2018年に出版されたばかりなので情報も新しいです。これからSpring Bootでアプリケーション開発をしたい方の最初に読む一冊としておすすめします。対象は初心者だけでなく上級者まで幅広く学べるので是非読んでみてください!

 

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です