Использование PasswordMatcher Широ с пользовательским царством
Я использую Apache Shiro с пользовательской областью JDBC для извлечения соли пользователя, пароля, имени алгоритма хеширования и количества итераций хеша из базы данных, которые все хранятся в виде отдельных столбцов.
Проблема заключается в том, что я не уверен, как мне следует обращаться с солью, которая была извлечена из базы данных, при использовании PasswordMatcher для проверки совпадений пароля пользователя, хранящегося в базе данных.
При использовании HashedCredentialsMatcher соль устанавливается с помощью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 (Object submitPlaintext, String сохранено) в строке 160 объект с именемrequest
содержит следующее
algorithmName=null
iterations=0
salt=null
source=cGFzc3dvcmQ=
Следующая строка кода на строке 161 вызываетcomputeHash(request)
В DefaultHashService.java, когда методcomputeHash(HashRequest request)
в строках 155 и 157 переменные имя_граммы и итерации правильно установленыSHA-256
а также1
соответственно. По строке 159 методgetPublicSalt(request)
называется однако, он возвращает нуль.
Кто-нибудь еще использовал PasswordMatcher Shiro с пользовательской областью, и если вы скажете Shiro использовать соль?