spring security ログインの設定時には、暗号化ができます。
通常、データベースには平文のパスワードではなく、パスワードのハッシュ値が保存されます。また、ソルトが追加されたパスワードのハッシュ値です。
そして、spring security は関連する暗号化の方法を提供しています。
BCryptPasswordEncoder#
現在、spring は BCryptPasswordEncoder
を使用してデータの暗号化と検証を推奨しています。
BCryptPasswordEncoder には、2 つの有効なメソッドがあります:encode と matches
encode メソッド#
BCryptPasswordEncoder の encode メソッドは、毎回新しいソルト値を生成します。
@Test
public void testEncoder() {
BCryptPasswordEncoder cryptPasswordEncoder = new BCryptPasswordEncoder();
logger.info(cryptPasswordEncoder.encode("dqn"));
logger.info(cryptPasswordEncoder.encode("dqn"));
logger.info(cryptPasswordEncoder.encode("dqn"));
logger.info(cryptPasswordEncoder.encode("dqn"));
logger.info(cryptPasswordEncoder.encode("dqn"));
}
ハッシュ値の中の $ はソルトの区切り文字であることがわかります
保存時には、ソルトが追加されたハッシュ値を保存することができます。
matches メソッド#
matches メソッドは、保存されたハッシュ値が特定のパスワードに属しているかどうかを比較します。
まず、保存されたハッシュ値からソルトを抽出し、パスワードに適用してハッシュ値を計算し、比較します。
encode を使用して試してみましょう:
logger.info("is true? {}",cryptPasswordEncoder.matches("dqn","$2a$1$95TYhnCLucrLeRDz9PVifuKm99u5mcMqRXe4bzirKOQZAjOhJ0Wr6"));
Security の設定で#
Security の設定ファイルに BCryptPasswordEncoder
を追加するのは非常に簡単です:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(username -> {
// return something;
}).passwordEncoder(new BCryptPasswordEncoder());
}
直接 new します。