Wie man einen Shiros Salz aus der Datenbank auflädt und verwendet

8

Ich benutze Shiro in der Anwendung für die Authentifizierung. Ich benutze Hash-Passwort mit einem Salz und ich speichern sie in meiner Datenbank wie folgt:

%Vor%

Ich speichere das Salz mit einem String in meiner Datenbank. Jetzt in meinem Bereich möchte ich meine Daten aus der Datenbank zurückholen, ich benutze dafür einen Transaktionsservice. Aber mein Salz ist ein Strong, also möchte ich es als ByteSource-Typ mit der statischen Methode zurückdrehen:

%Vor%

Aber wenn ich meine SaltedAuthenticationInfo erstelle, authentifiziert sie sich nicht.

Ich denke mein Problem ist von meiner Konvertierungsmethode:

%Vor%

Danke für Ihre Hilfe.

    
Fred37b 19.09.2012, 14:13
quelle

4 Antworten

13

Wie in der ausgezeichneten Antwort Ссылка erwähnt, generiert Shiros DefaultPasswordService bereits eindeutige Salze für jedes Passwort.

Es ist jedoch nicht erforderlich, einen benutzerdefinierten PasswordService zu implementieren, um den pro-Benutzer-Salzen ein privates Salz (manchmal auch "Pfeffer" genannt) hinzuzufügen. Privates Salz kann in shiro.ini konfiguriert werden:

%Vor%

Java-Code zum Erzeugen eines passenden Passwort-Hash:

%Vor%

Der resultierende Hash sieht folgendermaßen aus:

%Vor%

Das private Salz wird nicht in der Datenbank gespeichert, was es schwieriger macht, die Kennwörter zu knacken, wenn ein Angreifer Zugriff auf einen Datenbankabzug erhält.

Dieses Beispiel wurde mit shiro-1.2.2 erstellt.

Danke an Ссылка für Hilfe bei der Syntax für shiro.ini

    
Mikael Falkvidd 12.02.2014, 22:37
quelle
4

Haben Sie sich PasswordMatcher / PasswordService angesehen?

Damit ist bereits die gesamte Codier- / Decodier- / Vergleichslogik integriert. Um es zu benutzen:

Passwort in der Datenbank speichern:

%Vor%

Dann können Sie PasswordMatcher einfach als Matcher in Ihrem Realm verwenden.

%Vor%

oder in shiro.ini:

%Vor%     
jbunting 19.09.2012 15:59
quelle
4

Die DefaultPasswordService-Implementierung fügt jedem Aufruf von encryptPassword automatisch ein zufälliges Salt hinzu. Dieses "öffentliche" Salz wird in der "hashedPasswordBase64" gespeichert, die Sie von "encryptPassword" erhalten.

Da das "public" -Salz für jedes Hash-Passwort individuell erzeugt wird, kann man nicht einfach "einfach" eine Rainbow-Tabelle erzeugen und alle Hash-Passwörter auf einmal bruten. Für jedes Hash-Passwort müsste der Angreifer aufgrund des einzigartigen "öffentlichen" Salzes einen eigenen, einzigartigen Regenbogen-Tisch erzeugen. Bisher müssen Sie kein zusätzliches Salz in die Datenbank einfügen.

Um Ihre gespeicherten Hash-Passwörter noch sicherer zu machen, können Sie außerdem ein "privates" Salz hinzufügen, das irgendwo anders gespeichert werden sollte - solange es nicht in der Datenbank ist. Durch die Verwendung eines "privaten" Salzes könnten Sie die gehashten Passwörter vor einem brutalen Rainbow-Table-Angriff schützen, da der Angreifer das "private" Salz nicht kennt und das "private" Salz nicht aus den Datenbankeinträgen gewinnen kann.

>

Dies ist ein sehr einfaches Beispiel, wie ein PasswordService erstellt wird, der ein "privates" Salz als konstanten String verwendet und als CredentialsMatcher funktioniert:

%Vor%

Sie könnten dann Ihre eigene Implementierung in shiro.ini verwenden:

%Vor%

Dieses Beispiel wurde mit shiro-1.2.2 erstellt.

    
seafoxx 26.11.2013 00:10
quelle
1

Ich ändere meinen Typ für das Speichern meines Salzes. Jetzt benutze ich ein Byte [] anstelle eines Strings.

%Vor%

Und ich lagere das ByteTabSalt in meiner Datenbank.

    
Fred37b 20.09.2012 13:37
quelle

Tags und Links