2016-07-01 10 views
0

Ich benutze MD5-Algorithmus, um Passwörter mit Salz zu hacken. Nachdem ich einen Benutzer registriert habe, speichere ich sowohl Hash-Passwort als auch Salz in meiner SQL-Datenbank. Leider, wenn ich sie später abrufe, um sie mit den Eingaben des Benutzers zu vergleichen, adressiere ich ein Problem mit der Codierung von Salz. Ich speichere Salz als VARCHAR (16) und wenn ich versuche, es von meiner Datenbank abzurufen, konvertiert es in einer anderen Form. Dies ist mein Code:In welcher Form zu speichern Salz und wie man es später für das Passwort abrufen validieren

ResultSet rs = stmt.executeQuery("SELECT * FROM users"); 
String DB_salt1 = rs.getString("Salt"); 
byte [] DB_salt = DB_salt1.getBytes(); 

habe ich einige System.out.println(); Funktionen, um das Problem zu lokalisieren und ich fand heraus, dass byte [] DB_salt = DB_salt1.getBytes(); gibt das falsche Salz, während String DB_salt1 = rs.getString("Salt"); die richtige eine ausgibt. Meine Vermutung ist, dass es Byte-Verlust passiert.

EDIT: Um zu klären, um die richtige Salz und das in meiner Datenbank gespeichert, sagen wir, ist [B @ 4e25154. String DB_salt1 = rs.getString("Salt"); speichert dieses Salz; der Richtige. Aber wenn byte [] DB_salt = DB_salt1.getBytes(); ausgeführt wird, gibt es eine verschiedene Salz, die den gesamten Prozess ruiniert.

+0

Mögliche Duplikate von [Wo speichern Sie Ihre Salzstränge?] (Http://stackoverflow.com/questions/1219899/where-do-you-store-your-salt-strings) – Raedwald

+5

Verwenden Sie nicht MD5 für Passwörter, dafür ist es nicht gedacht. Andere Algorithmen, wie zum Beispiel bcrypt, sind viel besser und behandeln tatsächlich das Speichern des Salzes für Sie. – stuXnet

+0

Wenn Sie .getBytes() ausführen, erhalten Sie Bytes, wenn Sie getString() ausführen, erhalten Sie einen String. Beide haben ein anderes Aussehen, weil sie verschiedene Datentypen sind @stuXnet ist nicht MD5 der Standard und am häufigsten verwendete Methode, Passwörter zu hash? – KJaeg

Antwort

-1

Die beste Methode zum Speichern der Kennwörter in der Datenbank ist die Verwendung von BCrypt. Damit müssen Sie das Salz nicht lagern.

Unten ist der Beispielcode, der Bcrypt verwendet.

1) Zeichenfolge pw_hash = BCrypt.hashpw ("PLAIN PASSWORD", BCrypt.gensalt());

2) Lagern Sie die pw_hash in DB

3) if (BCrypt.checkpw ("PLAIN Passwort" pw_hash)) {System.out.println ("Erfolg Login"); } else {System.out.println ("Fehleranmeldung"); }

Die Schritte 1 und 2 werden ausgeführt, während der Benutzer das Kennwort zum ersten Mal registriert. Während Schritt 3 verwendet wird, wenn das angegebene Passwort mit dem verschlüsselten Passwort übereinstimmt.

+0

Leider möchte ich das Salz als Teil des Projekts speichern. – Xaris

+0

Wenn Sie das Salz in der DB speichern, kann jeder, der Zugriff auf die DB hat, das Salz und das Passwort sehen. Mit ihnen können sie das Passwort leicht entschlüsseln. Es ist also eine hohe Sicherheitsbedrohung. –

+3

Das Salz ist kein Geheimnis und Hashing ist keine Verschlüsselung. bcrypt infact speichert das Salz als Teil der Ausgabe, siehe [Bcrypt] (https://en.wikipedia.org/wiki/Bcrypt). Beispiel bcrypt-Ausgabe: "$ 2a $ 10 $ N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy", der Salzanteil ist "N9qo8uLOickgx2ZMRZoMye". – zaph

Verwandte Themen