2017-11-08 4 views
2

MD5(従来のもの)とBCryptパスワードの両方を含むユーザーテーブルがあります。私はMD5パスワードをブルートフォースなしでBCryptに移行したいと思っています。私は成功した認証でパスワードを再暗号化することを考えました。スプリングセキュリティ - 認証時にクリアパスワードを取得して再暗号化します

erase-credentialsauthentication-managerの宣言で無効にすると、(私の調査ではこれまでのところ)、パスワードを取得できます(ログインページから)。この場合、自分のカスタムAuthenticationSuccessHandlerからだけでなく、アプリケーション内のどこからでも(SecurityContextHolder.getContext().getAuthentication()を使用して)資格情報にアクセスできます。

認証に成功するとクリアパスワードにアクセスする方法はありますか?または、ユーザーの操作(パスワードの変更など)を求めずにパスワードを再暗号化するより良い方法を知っていますか?

答えて

0

ソリューションをありがとう新しい、より良い(bcryptの)エンコーダからのレガシーMD5ハッシュと値の両方を受け入れ、1を見つけたときにMD5ハッシュを移行パスワードエンコーダを作成することです。

@Component 
public class MigratingPasswordEncoder implements PasswordEncoder { 

    @Autowired 
    private org.springframework.security.crypto.password.PasswordEncoder passwordEncoder; // new encoder (BCrypt) 

    @Autowired 
    private Md5PasswordEncoder legacyEncoder; 

    @Autowired 
    private UserDao userDao; // where password hashes are stored 

    public String encodePassword(String rawPass, Object salt) { 
     return passwordEncoder.encode(rawPass); 
    } 

    public boolean isPasswordValid(String encPass, String rawPass, Object salt) { 
     if (legacyEncoder.isPasswordValid(encPass, rawPass, salt)) { 
      // MD5 hash found here, save a new hash instead 
      userDao.updatePassword(encPass, passwordEncoder.encode(rawPass)); 
      return true; 
     } 
     return passwordEncoder.matches(rawPass, encPass); 
    } 
} 

非推奨ノート:これはorg.springframework.security.authentication.encodingパッケージに古いPasswordEncoderインターフェースを使用していますが、それはMd5PasswordEncoderもそのインターフェイスを使用しているためので、かなり避けられません。

クレジット:Spring security 3.1.4 and ShaPasswordEncoder deprecationからのインスピレーション。

関連する問題