我使用Apache四郎與自定義JDBC領域來獲取用戶的鹽,密碼散列算法的名稱,並從數據庫中的散列值迭代方法都保存爲單獨的列數。使用Shiro的PasswordMatcher與自定義領域
的問題是我不能確定我應如何處理使用PasswordMatcher來驗證用戶的密碼匹配存儲在數據庫中,當已經從數據庫中檢索的鹽。
使用HashedCredentialsMatcher時,salt使用setCredentialsSalt
方法進行設置,但使用PasswordMatcher代替HashedCredentialsMatcher時似乎不是這種情況。
我使用自定義JDBC領域的代碼如下
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//code to retrieve user details from database removed for brevity
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, passwdSalt.password, getName());
info.setCredentialsSalt(new SimpleByteSource(passwdSalt.salt));
DefaultPasswordService passwordService = new DefaultPasswordService();
DefaultHashService hashService = new DefaultHashService();
PasswordMatcher passwordMatcher = new PasswordMatcher();
hashService.setHashAlgorithmName(passwdSalt.hashAlgorithmName);
hashService.setHashIterations(passwdSalt.hashIterations);
passwordService.setHashService(hashService);
passwordMatcher.setPasswordService(passwordService);
setCredentialsMatcher(passwordMatcher);
return info;
}
已經通過我已確認該代碼加強,這個問題肯定是由於鹽散列密碼時不被使用由用戶輸入以便將其與數據庫中的哈希密碼相匹配。在DefaultPasswordService.java當方法passwordsMatch(對象submittedPlaintext,字符串保存)被稱爲線160 request
命名的對象包含在線路下面的代碼
algorithmName=null
iterations=0
salt=null
source=cGFzc3dvcmQ=
下一行161個呼叫computeHash(request)
在DefaultHashService .java,當調用方法computeHash(HashRequest request)
時,在行155和157上,變量algorithmName和迭代分別正確設置爲SHA-256
和1
。在第159行,方法getPublicSalt(request)
被調用,但它回調爲空。
有其他人使用Shiro的PasswordMatcher使用自定義的境界,如果你怎麼告訴四郎使用鹽?
感謝您的快速回復。 Meri關於使用Shiro的優秀頁面是我使用的自定義領域的原始基礎,使用HashedCredentialsMatcher時它的工作正常,但如果將它交換爲PasswordMatcher,鹽似乎會丟失。 –
@PaulH - 對不起,我應該仔細閱讀這個問題。看看我在我的項目中做了什麼。我們必須在我們的設置中使用存儲過程來生成給定salt的密碼哈希。 – arunkumar
不用擔心,在從數據庫中檢索記錄時如何處理salt,以便將散列的密碼與用戶輸入的密碼進行比較?您是否也在代碼中使用HashedCredentialsMatcher或PasswordMatcher? –