Usando el PasswordMatcher de Shiro con un reino personalizado

Estoy usando Apache Shiro con un dominio JDBC personalizado para recuperar la sal, la contraseña, el nombre del algoritmo hash de un usuario y el número de iteraciones hash de la base de datos, que se almacenan como columnas separadas.

El problema es que no estoy seguro de cómo debo manejar el salt que se ha recuperado de la base de datos cuando uso PasswordMatcher para verificar que la contraseña del usuario coincida con la almacenada en la base de datos.

Cuando se usa el HashedCredentialsMatcher, la sal se establece usando elsetCredentialsSalt Sin embargo, parece que este no es el caso cuando se usa PasswordMatcher en lugar de HashedCredentialsMatcher.

El código que estoy usando en el reino JDBC personalizado es el siguiente

@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; 
} 

Después de haber recorrido el código, he confirmado que el problema se debe definitivamente a que no se usó la sal al incluir la contraseña introducida por el usuario para que coincida con la contraseña en la base de datos. En DefaultPasswordService.java cuando se llama al método passwordsMatch (Object submitPlaintext, String guardado) en la línea 160, el objeto denominadorequest contiene lo siguiente

algorithmName=null 
iterations=0 
salt=null 
source=cGFzc3dvcmQ= 

La siguiente línea de código en la línea 161 llamadascomputeHash(request)

En DefaultHashService.java cuando el métodocomputeHash(HashRequest request) se llama, en las líneas 155 y 157, las variables algorithmName y las iteraciones se configuran correctamente enSHA-256 y1 respectivamente. En la línea 159 el método.getPublicSalt(request) Se llama sin embargo se vuelve nulo.

¿Alguien más ha usado el PasswordMatcher de Shiro con un reino personalizado y si le dices a Shiro que use el salt?

Respuestas a la pregunta(3)

Su respuesta a la pregunta