如果你想切換到更安全的密碼編碼機制,那麼我會建議你使用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字符串有一個以$
符號開頭的獨特語法。
其他答案之一指出,此代碼可能會意外更新多個密碼在同一時間。這個問題表明,正在使用一種定製鹽,所以如果隨機選擇鹽,碰撞機率可以忽略不計,但情況並非總是如此。如果更新了兩個密碼,問題會是什麼?然後就可以檢測到帳號與bcrypt哈希具有相同的密碼。無論如何,情況就是這樣,因爲它要求SHA哈希值與更新發生時相同。如果您認爲這可能是一個問題(例如,因爲選擇不好的鹽或者使用無鹽散列),修改SQL以檢測此問題並使用單獨的BCrypt散列值執行多個更新將很微不足道。
感謝您的代碼。這或多或少是Spiff建議的。我的目標是能夠升級到未來版本的Spring Security,而不需要同時實現兩個實現,此解決方案僅在每個用戶都登錄時纔有效。我希望它會引入一個與舊版兼容的實現ShaPasswordEncoder。 –
如果用戶從未登錄過,那麼可能需要決定帳戶是否值得維護(經過適當的審閱期後)。如果它們不活動,您可以暫時禁用它們並向用戶發送郵件,要求他們重置密碼。不鼓勵使用舊的密碼編碼器,因爲它們相對不安全,容易出錯並且與其他系統不兼容。這些類已棄用,以阻止它們在新應用程序中的使用,但如果您不想使用更安全的選項,則無法阻止您使用它們。 –