2012-04-05 11 views
9

Ich arbeite an einem System, das Benutzerpasswörter mit MD5 (kein Salz) hashing. Ich möchte die Passwörter mit SHA-512 und einem Salz sicherer speichern.Verwenden Sie SHA-512 und Salz, um ein MD5-Hash-Passwort zu hashen?

Während dies für künftige Kennwörter einfach zu implementieren ist, möchte ich auch die vorhandenen MD5-Hash-Passwörter nachrüsten, vorzugsweise ohne alle Benutzer zur Änderung ihrer Kennwörter zu zwingen. Meine Idee ist, einfach SHA-512 und ein geeignetes Salz zu verwenden, um den vorhandenen MD5-Hash zu hashen. Ich kann dann entweder ein Flag in der Datenbank setzen, das anzeigt, welche Passwörter aus reinem Text gehashed wurden und welche Hashes aus einem MD5 Hash erzeugt wurden. Oder ich könnte beides einfach ausprobieren, wenn ich Benutzer authentifiziere. Oder hacken Sie einfach neue Passwörter mit MD5 und SHA-512/salt, so dass sie wie alte Passwörter behandelt werden können.

Programmatisch denke ich nicht, dass dies ein Problem sein wird, aber ich weiß nicht genug über Verschlüsselung/Hashing, um zu wissen, ob ich die Qualität des Hash in irgendeiner Weise kompromittiere, indem ich einen SHA-512/Salz-Hash zu einem Passwort, das bereits MD5 Hashed war. Mein erster Instinkt ist, dass, wenn überhaupt, es noch stärker wäre, ein sehr leichtes Key-Stretching.

Mein zweiter Instinkt ist, dass ich nicht wirklich weiß, wovon ich rede, also sollte ich besser einen Rat bekommen. Irgendwelche Gedanken?

+0

SHA-512 bietet gegenüber MD5 kaum Verbesserungen (zB: 'MD5 (salt + password)' ist praktisch äquivalent zu 'SHA512 (salt + password)'). Hash-Funktionen für allgemeine Zwecke wie MD5 und die SHA-Familie wurden ** nicht ** entwickelt, um Passwörter zu speichern. Verwenden Sie bcrypt. – NullUserException

+0

Sehr wahr. Eigentlich wollte ich Key Stretching machen, aber das habe ich in meiner Frage nicht deutlich gemacht. Am Ende habe ich PBKDF2 verwendet, anstatt meinen eigenen Key-Stretching-Algorithmus naiv zu implementieren. –

Antwort

6

Die Funktionszusammensetzung mit kryptografischen Primitiven ist gefährlich und sollte nicht vermieden werden, wenn sie vermeidbar ist. Die übliche Lösung für Ihre Art von Problem besteht darin, beide Hashes für einen Migrationszeitraum beizubehalten, wenn möglich den neuen Hash zu verwenden und alte Passwörter transparent zu aktualisieren (wenn Sie ein Passwort überprüfen und es mit dem neuen Algorithmus neu speichern und speichern)

Dies funktioniert nicht, wenn Sie ein Challenge-Response-basiertes Schema haben, bei dem Sie das Klartext-Passwort nicht sehen können .

+0

Dies ist eine großartige Antwort. Ich habe genau diese Art von Lösung implementiert und es ist eine großartige Möglichkeit, dies zu tun. – jeffsix

+0

Vielen Dank für den Vorschlag zum transparenten Wiederhashen, wenn sich der Benutzer anmeldet! Haben Sie Links, die erklären, warum das Anwenden eines SHA-512-Hashs auf einen MD5-Hashwert weniger sicher ist als das Anwenden eines SHA-512-Hashs auf ein Nur-Text-Passwort? Ich bin interessiert zu wissen, warum ... –

+1

@ JeremiahOrr: Für Ihre spezielle Anwendung wird die ordnungsgemäße Verwendung eines lang genug unvorhersehbaren Salzes viel mehr in Bezug auf Sicherheit tun, als das Hashing-Schema zu ändern. Wie j13r erklärt hat, wird die Anwendung von SHA auf MD5 den Raum möglicher Hashes nicht erweitern, da sie durch die möglichen Ergebnisse von MD5 eingeschränkt sind. Auch die Verwendung einer für Passwörter optimierten Einwegfunktion wäre noch besser, zum Beispiel [PBKDF2] (http://en.wikipedia.org/wiki/PBKDF2). – mensi

1

Vertrauen Sie Ihrem zweiten Instinkt. Verwenden Sie eine vorhandene Bibliothek, die speziell für Kennwörter erstellt wurde, anstatt zu versuchen, eigene zu erstellen.

Wahrscheinlich Hash Ihre neuen Passwörter mit MD5 und dann Hash MD5 mit Ihrem Passwort Hash-Bibliothek. Auf diese Weise können Sie die Abwärtskompatibilität mit Ihren alten Passwörtern aufrechterhalten.

I.e. password_hash (Alle alten, md5'd Passwörter) und password_hash (md5 (New Passwörter))

(Warnung: Ich bin kein Kryptographie-Experte)

http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

+0

Oh, ich habe nicht die Absicht, meine eigene Hashing-Bibliothek zu erstellen, ich muss nur wissen, was ich mit den bestehenden MD5-Hash-Passwörtern machen soll! –

+0

Ich bin kein Kryptographieexperte, aber ich würde einfach eine Password-Hashing-Funktion für die vorhandenen MD5-Passwörter ausführen. Bei neuen Passwörtern würden Sie zuerst den alten MD5-Algorithmus ausführen und ihn dann mit einer geeigneten Passwort-Hashing-Funktion versehen. Das, oder Sie können irgendwie markieren, ob das Passwort den alten oder neuen Algorithmus in der Datenbank verwendet (oder wo auch immer Sie es speichern). – tangrs

+0

@tangrs Seine ursprünglichen Passwörter sind auch MD5-Hash, es ist bereits gesichert. Er möchte auf SHA-512 mit Salz umsteigen, das sicherer ist. Warum würdest du ihm einen Doppel-Hashing vorschlagen? Das würde das Problem nicht lösen, wie man den Unterschied zwischen neuem und altem Passwort unterscheiden kann. Und Hash zu verdoppeln ist Sicherheit durch Dunkelheit, die genauso gut ist wie keine Sicherheit, weil niemand weiß, was zur Hölle los ist und wie man es hält. – Churk

4

Wenn Sie mit MD5-Hash zuerst, Sie werden nur die Verbreitung von MD5 (128 Bit) haben. Ein großer Teil des Speicherplatzes von SHA512 wird nicht von Ihren Passwörtern abgedeckt. Sie profitieren also nicht von SHA512, aber es ist nicht schlechter als MD5.

Sie haben den Vorteil, dass, wenn jemand den SHA512 Hash erhält und das Salz nicht kennt (das müssen Sie irgendwie erzwingen) die Hashes nicht nachschlagen und die Passwörter bekommen - was mit dem möglich wäre MD5-Datenbank, die Sie jetzt haben.

Also ja, Sie können nur die bestehenden MD5-Passwörter rehash. Aber wie im ersten Abschnitt erklärt, wäre es eine schlechte Idee, MD5 auch auf alle neuen Passwörter anzuwenden und sie dann als SH512 zu hashen. Eine einfache Implementierung wäre, ein Boolesches 'gesalzenes' Feld in der Datenbank neben den Hashes zu haben (aber setze das Salz dort nicht).

+0

'aber nicht das Salz da '- der springende Punkt eines Salzes ist, dass es nicht geheim gehalten werden muss und kann nur plaintext neben den Hashwerten gesetzt werden (Sie haben einen eindeutigen Hash pro Passwort!). Außerdem: Ist das "Hashing eines MD5-Passworts mit SHA-512 nicht schädlich", basierend auf tatsächlichen Fakten oder nur einer Intuition? Denn im Allgemeinen kann das Anwenden mehrerer Hashes mehr Schaden als Nutzen bringen. – Voo

+0

Der Punkt einer Hash-Funktion ist, dass sie eine eindeutige Zuordnung zwischen einer Zeichenfolge mit variabler Größe und einer Anzahl von n Bits bietet. Jede gute Hash-Funktion vermeidet Kollisionen, und tatsächlich ist es extrem schwierig, Kollisionen auf SHA-512 und sogar MD5 zu erzeugen (es sei denn, Sie haben eine beliebige Länge, die Sie nicht in Passwörtern haben). Es ist trivial, einen 128-Bit-Wert in einen 512-Bit-Bereich zu mappen (Sie haben 2^(512-128) unbenutzte Werte). Kollisionen (was der Schaden ist) sind äußerst unwahrscheinlich (Wahrscheinlichkeit 2^(128-512)). – j13r

0

Wenn Sie sich ansehen, wie die meisten Bank- und Hochsicherheitsleute dort ihr Passwort ändern.Die meisten von ihnen fragen grundsätzlich Leute, die die alte Verschlüsselungsmethode verwenden, um ein neues Passwort zu erstellen. Ich denke, Sie erste Lösung, ein Flag auf alle bestehenden alten MD5-Passwort-Benutzer zu setzen, und ihnen mitteilen, dass sie ein neues Passwort erstellen und langsam auf das neue System migrieren müssen. Auf diese Weise, wenn Sie das System schiessen, wenn etwas schief geht, werden Sie nicht fragen, ob dies ein neuer Benutzer oder ein alter Benutzer ist. Sind wir doppelt Hashing oder Single? Sollte niemals zwei Hash als mögliche Antwort vergleichen, was ist, wenn MD5 ('abc') => 123, SHA ('NO') => 123, bedeutet, dass jemand das falsche Passwort eingegeben haben könnte, aber immer noch hineinkommt.