Korzystanie z narzędzia PasswordMatcher Shiro z niestandardową dziedziną
Używam Apache Shiro z niestandardową dziedziną JDBC do pobierania soli użytkownika, hasła, nazwy algorytmu mieszania i liczby iteracji mieszania z bazy danych, które są przechowywane jako osobne kolumny.
Problem polega na tym, że nie jestem pewien, w jaki sposób powinienem obsługiwać sól pobraną z bazy danych podczas używania PasswordMatchera do sprawdzenia, czy hasło użytkownika pasuje do hasła zapisanego w bazie danych.
Podczas używania HashedCredentialsMatcher sól jest ustawiana za pomocąsetCredentialsSalt
metoda, jednak wydaje się, że nie jest tak w przypadku korzystania z PasswordMatcher zamiast HashedCredentialsMatcher.
Kod, którego używam w niestandardowej dziedzinie JDBC, jest następujący
@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;
}
Po przejściu przez kod potwierdziłem, że problem jest zdecydowanie spowodowany nie używaniem soli podczas mieszania hasła wprowadzonego przez użytkownika w celu dopasowania go do hashowanego hasła w bazie danych. W DefaultPasswordService.java, gdy metoda passwordsMatch (Obiekt przedstawionyPlaintext, String saved) jest wywoływana w linii 160 obiekt o nazwierequest
zawiera następujące elementy
algorithmName=null
iterations=0
salt=null
source=cGFzc3dvcmQ=
Następna linia kodu w linii 161 wywołujecomputeHash(request)
W DefaultHashService.java, gdy metodacomputeHash(HashRequest request)
jest wywoływana, w liniach 155 i 157 zmienne algorytmName i iteracje są poprawnie ustawione naSHA-256
i1
odpowiednio. W linii 159 metodagetPublicSalt(request)
jest nazywane, jakkolwiek powraca.
Czy ktoś inny użył Shiro's PasswordMatcher z niestandardową dziedziną i jeśli powiesz Shiro, żeby użył soli?