2009-09-04 9 views
14

Ich habe eine alte Anwendung, die Benutzerkennwörter in der Datenbank mit einem MD5-Hash gespeichert hat. Ich möchte dies durch etwas in der SHA-2-Familie ersetzen.Wie konvertiere ich Passwort Hashing von MD5 zu SHA?

Ich habe über zwei Möglichkeiten nachgedacht, um dies zu erreichen, aber beide scheinen ziemlich klobig.

1) Fügen Sie ein boolesches "Flag" -Feld hinzu. Wenn der Benutzer sich das erste Mal danach authentifiziert, ersetzen Sie den MD5-Passwort-Hash durch den SHA-Passwort-Hash und setzen Sie das Flag. Ich kann dann die Markierung überprüfen, um zu sehen, ob der Passwort-Hashwert konvertiert wurde.

2) Fügen Sie ein zweites Passwortfeld hinzu, um den SHA-Hash zu speichern. Wenn der Benutzer sich danach das erste Mal authentifiziert, hash das Passwort mit SHA und speichern Sie es in dem neuen Feld (wahrscheinlich löschen Sie gleichzeitig ihren MD5-Hash). Dann kann ich prüfen, ob das SHA-Feld einen Wert hat; das wird im Wesentlichen meine Fahne.

In beiden Fällen muss die MD5-Authentifizierung für einige Benutzer, die sich selten anmelden, für einige Zeit bestehen bleiben. Und alle Benutzer, die nicht mehr aktiv sind, werden niemals zu SHA wechseln.

Gibt es einen besseren Weg, dies zu tun?

+3

Ihre beiden versuchen Lösungen sehen für mich ok aus. – wtaniguchi

+0

Und ich erhöhe Neds Antwort, er hat einen guten Punkt dort. – wtaniguchi

+5

Wie für Benutzer, die nie geschaltet werden - ich würde in Betracht ziehen, nachdem ein bestimmter Prozentsatz von Leuten umgeschaltet worden ist und genügend Zeit vergangen ist, um nur die MD5-Hashes loszuwerden. Personen, die sich während dieser Zeit nicht eingeloggt haben, müssen ihre Passwörter zurücksetzen lassen, wenn sie sich erneut einloggen. Ob oder wann dies akzeptabel ist, ist eine geschäftliche Entscheidung. –

Antwort

11

im Wesentlichen gleich, aber vielleicht eleganter als das Hinzufügen von zusätzlichen Felder: In dem Standard-Authentifizierungs framwork in Django wird das Passwort-Hashes als Strings wie folgt aufgebaut gespeichert:

hashtype$salt$hash 

hashType entweder SHA1 oder MD5 ist, salt ist eine zufällige Zeichenfolge, mit der das rohe Passwort gesalzen wird, und schließlich kommt der Hash selbst.Beispielwert:

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4 
+0

Dies ist die beste Antwort. –

+0

Das einzige Problem dabei ist, dass es das Salz so speichert, dass es offensichtlich das Salz ist, anstatt einen anderen eindeutigen oder abgeleiteten Wert für den Benutzer zu verwenden (wie eine mutierte Version des Zeitstempels ihrer Kontoerstellung oder Bit) -flipping ihren Benutzernamen, usw.). Es ist fraglich, ob dies einen derzeit machbaren Unterschied macht, wie lange es dauern würde, um zu knacken, ich bin nur paranoid. – defines

+0

@Dustin: die zusätzliche Stärke hier ist das Salz kann jedes Mal geändert werden, wenn der Benutzer sein Passwort ändert. – Joshua

3

Ich denke, Sie haben bereits die besten Möglichkeiten. Ich mag # 1 mehr als # 2, da es keine Verwendung für die MD5 gibt, sobald der Sha gesetzt ist.

Es gibt keine Möglichkeit, das MD5 umzukehren. Sie müssen also warten, bis sich der Benutzer erneut authentifiziert, um einen neuen Hash zu erstellen.

0

Ihr zweiter Vorschlag klingt am besten für mich. Auf diese Weise haben häufige Benutzer eine sicherere Erfahrung in der Zukunft.

Der erste effektiv "quirks-mode" ist Ihre Codebase und stellt nur sicher, dass neue Benutzer die bessere SHA-Erfahrung haben.

+0

Für mich scheint es die beiden Lösungen sind die gleichen, nur etwas anders umgesetzt. In beiden Fällen wird Ihr Passwort bei Ihrem nächsten Login erneut aktualisiert. –

+0

In beiden Optionen würde ich die Kennwörter bestehender Benutzer bei der nächsten Anmeldung ersetzen. Es ist nur eine Frage, wie die App wissen kann, welchen Hashwert sie danach verwenden soll. –

2

Nein - im Grunde müssen Sie den MD5 in Position halten, bis alle Benutzer, die Ihnen wichtig sind, konvertiert wurden. Das ist nur die Art von Hashing - Sie haben nicht genügend Informationen, um die Konvertierung erneut durchzuführen.

Eine andere Option, die mit den anderen übereinstimmt, wäre, das Passwortfeld effektiv selbstbeschreibend zu machen, z.

MD5:(md5 hash) 
SHA:(sha hash) 

Sie könnten dann erkennen leicht, welcher Algorithmus zum Vergleich zu verwenden, und vermeiden Sie zwei Felder aufweist. Auch hier würden Sie den MD5 mit SHA überschreiben.

Sie möchten ein erstes Update durchführen, damit alle aktuellen Kennwörter sich als MD5 deklarieren.

+4

Die Größe des Hashes macht es selbstbeschreibend: MD5 ist immer kleiner. –

+2

Die Länge sollte nicht als einziger Indikator verwendet werden. Möglicherweise möchten Sie ändern, was in den Hash (z. B. Nonce-Berechnungen, andere Seed-Daten) geht, während Sie den gleichen Hash-Algorithmus verwenden, um alles zu zerhacken. Ein separater Bezeichner zeigt Ihnen an, welches * Ihres * Passwort-Hashing-Schemas verwendet wird. – Rob

+1

Wenn Ihre beiden Methoden sich in der Länge unterscheiden, können Sie die Länge sicherlich als Indikator verwenden. –

-1

Wenn die MD5 nicht gesalzen sind, können Sie immer eine Entschlüsselungsstelle/Rainbow-Tabellen wie: http://passcracking.com/index.php verwenden, um die Passwörter zu erhalten. Wahrscheinlich ist es einfacher, die re-encode-Methode zu verwenden.

+5

Wenn dies machbar ist, ist dies nicht sehr ethisch, es sei denn, Sie nehmen sehr viel Wert darauf, kein Passwort zu speichern, während Sie sie knacken. –

+3

@Vinko - aus irgendeinem Grund fühlt es sich unethisch an, auch wenn Sie darauf achten, dass das Passwort nicht gespeichert wird. –

6

können Sie konvertieren alle Ihre MD5 Strings zu SHA1, indem sie in Ihrem DB Wiederkäuen wenn Sie mit dem ersten MD5ing sie Ihre Zukunft Passwörter erstellen. Die Überprüfung der Passwörter erfordert MD5 auch zuerst, aber ich glaube nicht, dass das ein großer Erfolg ist.

PHP-Code (Login):

zurück: $ login = (md5 ($ password) == $ storedMd5PasswordHash);

nach: $ login = (sha1 (md5 ($ passwort)) == $ storedSha1PasswordHash);

Funktioniert auch mit dem Salzen, bekam die ursprüngliche Idee von here.

-4

Ja sollten Sie das echte Passwort erst einmal wissen, bevor Sie es in sha-1 umwandeln ..

Wenn Sie das echte Passwort von md5 verschlüsselte Zeichenfolge finden möchten, können Sie md5pass.com

+3

Dies sollte niemals in einem gut entworfenen System möglich sein. Alle Passwörter sollten gesalzen gespeichert werden. –

Verwandte Themen