Usando o PasswordMatcher de Shiro com um reino personalizado
Estou usando o Apache Shiro com um território JDBC personalizado para recuperar o status de sal, senha, hash do algoritmo de hash do usuário e o número de iterações de hash do banco de dados, todas armazenadas como colunas separadas.
O problema é que não tenho certeza de como lidar com o salt recuperado do banco de dados ao usar o PasswordMatcher para verificar se a senha do usuário corresponde àquela armazenada no banco de dados.
Ao usar o HashedCredentialsMatcher, o sal é definido usando osetCredentialsSalt
método, no entanto, parece que este não é o caso quando se utiliza o PasswordMatcher em vez do HashedCredentialsMatcher.
O código que estou usando no domínio JDBC personalizado é o seguinte
@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;
}
Depois de passar pelo código, confirmei que o problema é definitivamente devido ao fato de o salt não estar sendo usado ao codificar a senha inserida pelo usuário, a fim de associá-la à senha com hash do banco de dados. Em DefaultPasswordService.java quando o método passwordsMatch (Object submittedPlaintext, String salvo) é chamado na linha 160 do objeto nomeadorequest
contém o seguinte
algorithmName=null
iterations=0
salt=null
source=cGFzc3dvcmQ=
A próxima linha de código na linha 161 chamadascomputeHash(request)
Em DefaultHashService.java quando o métodocomputeHash(HashRequest request)
é chamado, nas linhas 155 e 157, as variáveis algorithmName e iterações estão corretamente definidas comoSHA-256
e1
respectivamente. Na linha 159 o métodogetPublicSalt(request)
é chamado no entanto, ele retira null.
Alguém mais usou o PasswordMatcher de Shiro com um reino personalizado e como você diz ao Shiro para usar o sal?