2014-06-12 23 views
7

Ich habe eine Frage zum Verständnis Sha512-Crypt Hashing. Ich habe dieses tutorial gefunden, um Dovecot und Postfix mit mysql einzurichten. Ich folgte dem Tutorial (mit leichten Modifikationen) und alles funktioniert gut. Aber es ist eine Sache, dass ich nicht verstehe:sha512-crypt mysql und dovecot

Um einen Benutzer hinzuzufügen, soll ich verwenden:

INSERT INTO `mailserver`.`virtual_users` 
    (`id`, `domain_id`, `password` , `email`) 
VALUES 
    ('1', '1', ENCRYPT('firstpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]'), 
    ('2', '1', ENCRYPT('secondpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]'); 

und wieder, das perfekt funktioniert gut, also kann ich mit meinem Passwort einloggen (und nur mein Passwort) zu dovecot. Aber warum? Wenn ich es richtig sehe, verschlüsselt es das Passwort mit einem zufälligen Salz, aber es speichert es nirgends. Das gleiche Passwort zweimal zu erhalten, gibt mir zwei verschiedene Hashes (ich habe es ausprobiert). Also meine Frage läuft auf: Könnte ich eine kurze Erklärung von sha-512 bekommen (die ich nicht online finden konnte) und und Erklärung, warum diese Linien arbeiten?

Danke schon

+0

Haben Sie zufällig die Abfrage gefunden, die das Passwort/Benutzer mit der Datenbank übereinstimmt? –

+0

Ja, es ist: 'password_query = SELECT Passwort von Benutzer WHERE username = '% u'' – ciem

Antwort

10

Das Salz wird als Teil des Passworts gespeichert. Zum Beispiel ruft:

ENCRYPT('firstpassword', CONCAT('$6$', 'FooBarBaz')) 

Gibt

$ 6 $ foobarbaz $ .T.G.7FRJqZ6N2FF7b3BEkr5j37CWhwgvPOOoccrr0bvkBbNMmLCxzqQqKJbNhnhC.583dTBLEuZcDuQe7NEe.

Diese speichert sowohl der verwendete Algorithmus (6 sein SHA512) und das Salz ('foobarbaz'), die beide von delinated $.

Edit: Um ein Passwort überprüfen Sie verwenden können:

password = ENCRYPT('user_input', `password`) 

ENCRYPT wird das Salz aus dem gespeicherten Passwort greifen und diese verwenden, wenn user_input überprüfen.

Volle Gutschrift zu hek2mgl für die Passwort-Prüfung er detailliert in this answer.

+0

Vielen Dank, das war's. Hat mysql haben eine einfache Möglichkeit, ein Passwort gegen eine Zeichenfolge übereinstimmen, die wie die in der Datenbank gespeichert wird? I.e. eine Funktion, die ich '$ 6 $ foobarbaz $ .T.G.7FRJqZ6N2FF7b3BEkr5j37CWhwgvPOOoccrr0bvkBbNMmLCxzqQqKJbNhnhC.583dTBLEuZcDuQe7NEe' und ein Passwort geben kann es gegen Übereinstimmen als Argument irgendwie wahr oder falsch zurückkehrt? – ciem

+0

@ciem ENCRYPT kann dafür verwendet werden. Ich werde in einem Beispiel bearbeiten. – Jim

+0

Dank für die ausführliche Antwort – ciem