2013-10-20 50 views
5

我如何加密密碼插入到數據庫和比較後,他會想要連接?如何使用Spring StandardPasswordEncode並獲取Salt生成?

我會使用StandardPasswordEncoder Spring安全性3.1.4來加密我的密碼並插入到數據庫中。但是,我如何恢復該方法產生的鹽?

這裏是DOC春季安全的例子:

StandardPasswordEncoder encoder = new StandardPasswordEncoder("secret"); 
String result = encoder.encode("myPassword"); 
assertTrue(encoder.matches("myPassword", result)); 

我問她,因爲我需要的SELT以重新編碼用於比較的密碼?並驗證用戶是否必須輸入正確的密碼?

這裏的密碼編碼:9e7e3a73a40871d4b489adb746c31ace280d28206dded9665bac40eabfe6ffdc32a8c5c416b5878f ,我會比較編碼的新密碼

鏈接文檔春:http://docs.spring.io/spring-security/site/docs/3.1.4.RELEASE/reference/crypto.html 鏈接API春季安全3.1.4:http://docs.spring.io/spring-security/site/docs/3.1.4.RELEASE/apidocs/

+0

你不能老朽保存的密碼作爲人類可讀。 – Prabhakaran

+0

我如何加密密碼插入到數據庫和比較後,他會想要連接? – MaximeF

+0

作爲旁白,我建議BCryptPasswordEncoder – farrellmr

回答

5

我想你問它是如何工作的?答案很簡單。 StandardPasswordEncoder.matches()是您想要使用的方法。在幕後,StandardPasswordEncoder將解碼哈希密碼並從生成的字節數組中提取salt。然後它將使用該salt來散列您傳入的純文本密碼。如果生成的散列值與原始散列值相匹配,則您的密碼匹配!請參閱源背後StandardPasswordEncoder.matches()細節:

public boolean matches(CharSequence rawPassword, String encodedPassword) { 
    byte[] digested = decode(encodedPassword); 
    byte[] salt = subArray(digested, 0, saltGenerator.getKeyLength()); 
    return matches(digested, digest(rawPassword, salt)); 
} 
+0

爲了澄清,「解碼」似乎意味着「將十六進制字符串轉換爲字節」。 –

+0

那不清楚嗎? – MattSenter

2

你不能老朽保存的密碼作爲人可讀。

假設myPassword ="9e7e3a73a40871d4b489adb746c31ace280d28206dded9665bac40eabfe6ffdc32a8c5c416b5878f" pesent在數據庫中。

你可以這樣做

StandardPasswordEncoder encoder = new StandardPasswordEncoder("secret"); 
String result = encoder.encode("myPassword"); 

now your result is equal to `9e7e3a73a40871d4b489adb746c31ace280d28206dded9665bac40eabfe6ffdc32a8c5c416b5878f` 

String passworddb = getPasswordFromDB(); 

passworddb from daabase is `9e7e3a73a40871d4b489adb746c31ace280d28206dded9665bac40eabfe6ffdc32a8c5c416b5878f` 

assertTrue(encoder.matches(passworddb, result)); then passworddb and result are equal. 
相關問題