2014-11-04 147 views
0

我在嘗試匹配使用spring-security-core:2.0-RC4Grails 2.3.3的用戶的密碼時遇到問題。沒有方法的簽名BCryptPasswordEncoder.matches()適用於參數類型:(java.lang.String,java.lang.String)

passwordEncoder.matches(rawPassword, encodedPassword)

No signature of method grails.plugin.springsecurity.authentication.encoding.BCryptPasswordEncoder.matches() is applicable for argument types: (java.lang.String, java.lang.String) 

當我檢查了BCryptPasswordEncoder source來尋找線索,在PasswordEncoder class definition結束了,我發現了以下錯誤。

BCryptPasswordEncoder中的導入看起來不正確,因爲新的PasswordEncoder在org.springframework.security.crypto.password中。

passwordEncoder.isPasswordValid(rawPassword, encodedPassword, null)工程(如在,沒有錯誤),但我不知道如何得到鹽。

這工作正常嗎?如果是這樣,我該如何獲得鹽?

編輯: 我試着用NullSaltSource太多,但它給我的錯誤:

Salt value must be null when used with crypto module PasswordEncoder 
+1

顯然我不認爲我有任何問題。我所需要做的就是將編碼與原始密碼交換,如下所示: passwordEncoder.isPasswordValid(encodedPassword,rawPassword,null)起作用。 – dosaki 2014-11-07 12:50:28

+0

下一個代碼片段出現在文檔中:if(!passwordEncoder.isPasswordValid(user.password,password,null/* salt * /)){flash.message ='當前密碼不正確' render view:'passwordExpired' ,model:[username:session ['SPRING_SECURITY_LAST_USERNAME']] return } – 2016-03-29 14:54:15

回答

0

由於錯誤說,你不能使用鹽和bcrypt。這很好,但算法非常強大,就好像它已經使用鹽一樣。

鹽的一點是確保如果你和我有相同的密碼,我們沒有相同的哈希密碼(假設我們每個人都有自己的salt值)。無損密碼不能去除哈希值,但可以爲所有組合的密碼創建一個哈希表,並將其用作查找來查找給定哈希值的明文密碼。做一個互聯網搜索「彩虹表」,你會發現有MD5,SHA-1和其他算法查找表的網站。

如果使用bcrypt運行帶空鹽值的encodePassword,則每次運行都會得到不同的哈希字符串。使用更簡單算法的isPasswordValid方法實現通常會將明文密碼與所提供的salt一起散列(如果有),並檢查該值是否與存儲的散列相同。但是使用bcrypt還不夠,所以它有邏輯來驗證它們是等價於,但不一定相等。

該插件使用兩個接口的實現混合以實現向後兼容性,並將在未來版本中放棄對舊接口的支持。

+0

那麼,'passwordEncoder.isPasswordValid(rawPassword,encodedPassword,null)'工作嗎?我試圖檢查兩個相同的密碼是否匹配,但是'isPasswordValid'的結果說他們不是。 – dosaki 2014-11-05 10:09:37

相關問題