Verwenden von Shiros PasswordMatcher mit einem benutzerdefinierten Bereich

Ich verwende Apache Shiro mit einem benutzerdefinierten JDBC-Realm, um das Salt, das Kennwort, den Namen des Hash-Algorithmus und die Anzahl der Hash-Iterationen eines Benutzers aus der Datenbank abzurufen, die alle als separate Spalten gespeichert sind.

Das Problem ist, dass ich nicht sicher bin, wie ich mit dem Salt umgehen soll, das aus der Datenbank abgerufen wurde, wenn der PasswordMatcher verwendet wird, um zu überprüfen, ob das Kennwort des Benutzers mit dem in der Datenbank gespeicherten übereinstimmt.

Bei Verwendung des HashedCredentialsMatcher wird das Salt mit dem eingestelltsetCredentialsSalt Dies scheint jedoch nicht der Fall zu sein, wenn der PasswordMatcher anstelle des HashedCredentialsMatcher verwendet wird.

Der Code, den ich im benutzerdefinierten JDBC-Bereich verwende, lautet wie folgt

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

Nachdem ich den Code durchgegangen bin, habe ich bestätigt, dass das Problem definitiv darauf zurückzuführen ist, dass das Salt beim Hashing des vom Benutzer eingegebenen Passworts nicht verwendet wird, um es mit dem Hashing-Passwort in der Datenbank abzugleichen. Wenn in DefaultPasswordService.java die Methode passwordsMatch (Object submitPlaintext, String saved) in Zeile 160 aufgerufen wird, wird das Objekt benanntrequest enthält folgendes

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

Die nächste Codezeile in Zeile 161 ruft aufcomputeHash(request)

In DefaultHashService.java bei der MethodecomputeHash(HashRequest request) wird aufgerufen, in den Zeilen 155 und 157 werden die Variablen algorithmName und iterations korrekt auf gesetztSHA-256 und1 beziehungsweise. Online 159 die MethodegetPublicSalt(request) heißt aber es gibt null zurück.

Hat jemand anderes Shiros PasswordMatcher mit einem benutzerdefinierten Bereich verwendet und wie sagt man Shiro, er soll das Salz verwenden?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage