0 votes
asked in Bugs & Feature Requests by
edited

Vorgehen:
Habe ein neues RCX Projekt erstellt. Darin dann eine LoginForm mit AuthenticationProvider gegen eine DB-Tabelle.
Beim Testen habe ich festgesttellt, dass in der Klasse JPAAuthenticator der PasswordHasher mit

this.passwordHasher.validatePassword(credentials.password(), entity.password())

nicht funktioniert.

Ich kann als Verschlüsselung wählen welche ich will, ich kann in die DB-User Tabelle auch das entsprechend verschlüsselte Passwort eintragen.
Es kommt immer der Fehler, dass das Passwort falsch ist. bzw. die Funktion this.passwordHasher.validatePassword(credentials.password(), entity.password()) bringt immer "NULL".

Lösung:
Fehler ist gemeldet.
Habe den PasswordHasher durch einen eigenen ersetzt.

Ps: Bleibt Gesund!
Einfache Validator:

import org.apache.commons.codec.digest.DigestUtils;
public class EncodePassword
{
    public synchronized boolean TestPassword(final String Cleartextpassword, final byte[] DBpassword)
    {
        final String dbpw      = new String(DBpassword);
        final String sha256hex = DigestUtils.sha256Hex(Cleartextpassword);
        System.out.println(EncodePassword.getLineNumber() + " sha256hex: " + sha256hex);
        System.out.println(EncodePassword.getLineNumber() + " dbpw:      " + dbpw);

        if(sha256hex.equals(dbpw))
        {
            System.out.println(EncodePassword.getLineNumber() + " return true");
            return true;
        }
        else
        {
            System.out.println(EncodePassword.getLineNumber() + " return false");
            return false;
        }
    }
   
    public static String getLineNumber()
    {
        return String.valueOf(Thread.currentThread().getStackTrace()[2].getLineNumber());
    }
}

Anm: System out und getLineNumber sollten noch entfernt werden ;-)

maven dependency:

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.11</version>
        </dependency>

1 Answer

0 votes
answered by (1.1k points)

Ist das Problem noch aktuell? Ich hab versucht das Problem zu reproduzieren, aber ohne Erfolg. Ich habe das ganze mit der LoginView-Template ausprobiert.

Der Code um einen neuen User anzulegen:
final AuthUser u = new AuthUser();
u.setUsername("admin");
u.setPassword(MyAuthenticationProvider.getInstance().getPasswordHasher().hashPassword("admin".getBytes()));
new AuthUserDAO().save(u);

Der Code der automatisch von der Template für die Überprüfung generiert wird:
private void loginForm_onLogin(final LoginEvent event)
{
    final CredentialsUsernamePassword credentials = CredentialsUsernamePassword.New(event.getUsername(), event.getPassword());
    final MyAuthenticationProvider authenticatorProvider = MyAuthenticationProvider.getInstance();
    if(!Authentication.tryLogin(credentials, authenticatorProvider))
    {
        this.loginForm.setError(true);
    }
}

commented by (540 points)
edited by
Ich habe das nicht nochmal getestet, da ich mir meine eigene routine dafür geschrieben habe.
Am We werde ich das testen und dann nochmal melden.
Allerdings habe ich das PW hash über den in der Doku beschriebenen link erstellt: https://www.browserling.com/tools/sha2-hash
commented by (540 points)
Habe das heute nochmal getestet und ein Video erstellt.
Dazu habe ich eine leere Datenbank erstellt.
Ein neues RCX Projekt mit einem LoginView
Es funktioniert nicht.

Da ich nicht ausschließen kann, dass es an mir liegt, habe ich Video und Code unter folgendem Link abgelegt:

https://www.magentacloud.de/share/14kxyhpki5
Das Passwort sende ich per mail mangels anderer Möglichkeit an Ihren Kollegen S.Späth, mit der Bitte es Ihnen weiter zu leiten.
Hoffe das passt so?
Vielen Dank!
commented by (1.1k points)
Ich habe mir das Video angeschaut und habe keinen Fehler entdeckt. Was ich mir aber noch vorstellen kann ist, dass die byte-arrays nicht als hex string dargestellt werden in dem Datenbank tool. Ich kann das leider nur gerade nicht testen, da ich auf meiner momentanen Maschine keine Datenbanktools installiert habe.

Könnten Sie vielleicht ausprobieren, ein Passwort per MyAuthenticationProvider.getInstance().getPasswordHasher().hashPassword() zu generieren und dieses dann per UserDAO in die Datenbank zu speichern?
Da sollte man dann sehen können, ob das per Datenbanktool gespeicherte Passwort das gleiche ist wie das neue per Code gespeicherte Passwort.

Mit freundlichen Grüßen,
MS
commented by (540 points)
Ich werde versuchen, das vor meinem Urlaub noch zu machen und gebe dann wieder hier feedback
LG
commented by (540 points)
edited by
Also, habe das nun nochmal getestet.
Es ist tatsächlich so, dass das Passwort, dass in dem Datenbankfeld über den code gespeichert wird unterschiedlich zu dem ist, dass über die Hashgeneratoren generiert wird.
Passwort: testpasswort
Über browserling.com generiert, SHA256: 94ac5813105c9887c263df59d0145af2b4df7b49969a08fba624e55eec25d6b1
Über hashgenerator generiert, SHA256:   94ac5813105c9887c263df59d0145af2b4df7b49969a08fba624e55eec25d6b1

Über den code generiert:
----------------
        final User u = new User();
        u.setUsername("admin2");
        u.setPassword(
            MyAuthenticationProvider.getInstance().getPasswordHasher().hashPassword("testpasswort".getBytes()));
        new UserDAO().save(u);
----------------
SHA256:  ¬X  \  ÂcßYÐ Zò´ß{I   û¦$å^ì%Ö±

Einstellung in der MyAuthenticationProvider.java:
    private final PasswordHasher passwordHasher = PasswordHasher.Sha2();

Also ist Eure Anleitung so nicht verwendbar, sondern die User müssen über den code angelegt werden.
Sobald der User über den code angelegt wurde funktioniert auch der login!
Welcome to Rapidclipse Q&A, where you can ask questions and receive answers from other members of the community.
Powered by Question2Answer
...