2016-03-31 34 views
3

私はアプリケーションでSpringセキュリティを使用し、パスワード変更オプションのDBに保存されているパスワードでユーザー入力を検証したいと考えています。Spring Security - BcryptPasswordEncoder

パスワードはDBに次のように格納されます。ここ

user.setPassword(new BCryptPasswordEncoder().encode("<userPassword>")); 

パスワードを入力したユーザは、上記のロジックを使用して符号化し、DBに格納されます。今私はパスワードを変更するためにユーザーからパスワードを取得しようとしています。ユーザーからパスワードを取得した後、上記のロジックを使用してエンコードし、DBと比較しようとします。エンコードに同じロジックを使用しても、エンコードされた値は異なるようです。

WebSecurityConfigから私の設定:

@Autowired 
public void configAuthentication(final AuthenticationManagerBuilder auth) throws Exception { 

    auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); 

} 

私が比較して何が間違っていることを確認していません。

+0

:その後、代わりにrawPasswordをコードしてString#equalsを使用して結果を比較すると、PasswordEncoder#matchesメソッドを使用できますか? 'String#equals'または' PasswordEncoder#matches'を使用していますか? –

答えて

5

エンコーディングで同じロジックを使用しても、エンコードされた値が異なるようです。

Bcryptアルゴリズムは、毎回異なる塩ビルトインを使用します。だから、そうであっても同じクリアテキスト同じ符号化プロセスのために異なる暗号文 Sを生成します。

ユーザーからパスワードを取得した後、私は上記のロジック を使用してエンコードし、生パスワードをコードしていないDB

と比較してみてください。 rawPasswordがクライアントから与えられたパスワードで、encodedPasswordがデータベースの暗号化された保存パスワードであるとします。あなたがお互いにエンコードされたパスワードを比較しましたか

PasswordEncoder passwordEnocder = new BCryptPasswordEncoder(); 
if (passwordEncoder.matches(rawPassword, encodedPassword)) { 
    System.out.println("Matched!"); 
} 
関連する問題