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でアプリケーション開発をしたい方の最初に読む一冊としておすすめします。対象は初心者だけでなく上級者まで幅広く学べるので是非読んでみてください!
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す