より安全なパスワード エンコーディング メカニズムに切り替えたい場合は、BCryptを使用することをお勧めします。ユーザーを移行するには、次のようなものを使用します。
// Implement the old PasswordEncoder interface
public class MigrateUsersPasswordEncoder implements PasswordEncoder {
@Autowired
ShaPasswordEncoder legacyEncoder;
@Autowired
JdbcTemplate template;
BCryptPasswordEncoder bcryptEncoder = new BCryptPasswordEncoder();
@Override
public String encodePassword(String rawPass, Object salt) {
return bcryptEncoder.encode(rawPass);
}
@Override
public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
if (legacyEncoder.isPasswordValid(encPass, rawPass, salt)) {
template.update("update users set password = ? where password = ?", bcryptEncoder.encode(rawPass), encPass);
return true;
}
return bcryptEncoder.matches(rawPass, encPass);
}
}
パスワード フィールドの形式によって、移行されたユーザーの割合を確認できます。$
BCrypt 文字列には、記号で始まる独特の構文があります。
他の回答の 1 つは、このコードが誤って複数のパスワードを同時に更新する可能性があることを指摘しています。質問には、カスタム ソルトが使用されていると記載されていたため、ソルトがランダムに選択された場合、衝突の可能性はごくわずかですが、常にそうであるとは限りません。2 つのパスワードが更新された場合、何が問題になりますか? これにより、アカウントが bcrypt ハッシュから同じパスワードを持っていることを検出できます。いずれにしても、更新を行うには SHA ハッシュが同じである必要があるためです。それが問題であると思われる場合 (たとえば、ソルトの選択が不適切であったり、ソルトなしのハッシュを使用しているなどの理由で)、SQL を変更してこれを検出し、個別の BCrypt ハッシュ値で複数の更新を実行するのは簡単です。