Konvertieren von md5 Passwort-Hashes nach PHP 5.5 password_hash ()

8

Die neue password_hash API in PHP 5.5 ist nett und ich möchte sie überall verwenden. Bei einem älteren Projekt mit einer älteren Datenbank, in der Kennwörter in MD5-Hashes gespeichert sind, was ist der beste Weg, um alte Benutzerkennwörter auf die neue, sicherere API zu migrieren?

Abgesehen davon, dass Benutzer lediglich aufgefordert werden, ihr Passwort bei der nächsten Anmeldung zurückzusetzen (dies ist für Benutzer unpraktisch und lästig), habe ich über die Möglichkeit nachgedacht, den aktuellen md5-Hash als Eingabe für password_hash () für alle meine bestehenden Benutzer zu verwenden. Um Passwörter für diese Benutzer zu überprüfen (während der Anmeldung), würde ich ihre Eingabe in einen md5-Hash konvertieren und diesen dann zu password_verify () verwenden. Neuen Benutzern bleibt dieser zusätzliche Schritt erspart.

Ist das ein lohnender Weg? Gibt es bessere Möglichkeiten für eine transparente Migration, bei der Benutzer nicht über das Zurücksetzen von Kennwörtern geärgert werden, aber ich kann sofort von den Vorteilen eines sichereren Hashings profitieren?

Am wichtigsten ist, gibt es sogar einen Sicherheitsvorteil, wenn man vorhandene md5-Hashes (die für Brute-Force anfällig sind) nimmt und die password_hash () - API verwendet, um sie doppelt zu hashen?

    
Aron 19.09.2013, 23:38
quelle

3 Antworten

9

In Ihrem login.php (?) konvertieren Sie die alten Passwörter von MD5 nach bcrypt und ersetzen den alten MD5-Hash in der Datenbank durch den neuen.

Pseudocode:

%Vor%

Doppeltes Hashing würde die Sicherheit von bcrypt nicht erhöhen, da bcrypt itsf eine Einweg-Hashing-Funktion ist.

Nota: MD5 erzeugt eine Zeichenfolge mit 32 Zeichen Länge, während password_hash() mindestens 60 Zeichen enthält.

Lesen Sie das Handbuch:

Falls und wenn Sie sich dazu entschließen, password_hash() oder das Kompatibilitäts-Pack (falls PHP & lt; 5.5) Ссылка , es ist wichtig zu beachten, dass, wenn die aktuelle Passwortspalte eine Länge von weniger als 60 hat muss zu diesem (oder höher) geändert werden. Das Handbuch schlägt eine Länge von 255 vor.

Sie müssen die Länge Ihrer Spalte ändern und mit einem neuen Hash beginnen, damit sie wirksam wird. Andernfalls wird MySQL im Hintergrund fehlschlagen.

    
Fabian 20.09.2013, 00:03
quelle
2

Da es sich um eine Einwegverschlüsselung handelt, können Sie, sofern Sie nicht möchten, dass die Benutzerkennwörter auf Ihrer Anmeldeseite nicht sicher sind, die Benutzer ihre Kennwörter erneut eingeben lassen. Die andere Option besteht darin, alle Datenbankeinträge mit password_hash() über ihren md5() hashed Passwörtern neu zu verschlüsseln und diese Werte in der Datenbank zu speichern, dann setzen Sie auf Ihrer Login-PHP-Seite die password_hash() um Ihre md5() herum wie:

%Vor%

Bei der zweiten Möglichkeit müssen Sie die Passwörter des Benutzers nicht zurücksetzen lassen.

    
PHPglue 20.09.2013 00:09
quelle
0

Es gibt einen sehr speziellen Anwendungsfall, der hier noch nicht erwähnt wurde, und das ist, wenn Sie bereits einen ersten Schritt gemacht haben und crypt function verwenden, aber immer noch den MD5-Algorithmus verwenden.

In diesem Fall würde Ihr Kennwort Hashing bei der Registrierung / Passwortänderung wie folgt aussehen:

%Vor%

Und dann hätten Sie einen Vergleich mit:

%Vor%

Das Schöne an diesem Übergang ist, dass Ihre Datenbank bereits im Zustand " password_verify " bereit ist.

Die Registrierung / Passwortänderung würde zu:

werden %Vor%

Und Sie würden den Vergleich durch ersetzen:

%Vor%

Dies würde einfach funktionieren und alle Passwörter des Benutzers bei der nächsten Passwortänderung aktualisieren. Aber wir müssen nicht warten und tun, was @Fabian in seiner Antwort getan hat.

Hier müssen wir nur den Login ändern:

%Vor%

Dies würde den zusätzlichen Vorteil bieten, dass Benutzerkennwörter aktualisiert werden, sobald der neue Kennwortalgorithmus zu PHPs Standard wird. Du müsstest wirklich absolut nichts tun.

Wenn Sie zusätzliche Parameter für Ihre Passwort-Hashing-Funktion verwenden möchten (z. B. Ändern der "Kosten"), sollten Sie sich password_hash und password_needs_rehash Dokumentation, achten Sie auf optional letzter Parameter $options .

    
v010dya 27.10.2015 15:08
quelle