it-swarm.com.de

Wie verwende ich den Argon2-Algorithmus mit password_hash?

Also habe ich gehört, dass PHP 7.2 den neuen Argon2-Algorithmus eingeführt hat. Aber ich bin verwirrt, wie ich ihn mit meinem vorhandenen Code verwenden kann. Zum Beispiel habe ich diesen

$password = password_hash('somepassword', PASSWORD_DEFAULT, ['cost' => 12]);

Verwendet PASSWORD_DEFAULT Jetzt Argon2? Was muss ich gegebenenfalls mit password_verify Ändern? Wird bcrypt jetzt als unsicher angesehen?

20
Machavity

Was ist Argon2? Ist bcrypt jetzt schlecht?

Vor PHP 7.2) war der einzige verwendete Hashing-Algorithmus password_hash Bcrypt. Zum jetzigen Zeitpunkt wird bcrypt immer noch als starker Hash angesehen, insbesondere im Vergleich zu seinen Vorgängern md5 Und sha1 (Beide sind nsicher, weil sie schnell sind ). Argon2 ist einfach ein teurerer Algorithmus für Brute Force

Argon2i verwendet einen datenunabhängigen Speicherzugriff. Es ist langsamer, weil es mehr Pässe über den Speicher macht, um sich vor Kompromissangriffen zu schützen. Es wird dringend für Passwort-Hashing und passwortbasierte Schlüsselableitung empfohlen.

Bcrypt ist immer noch ein akzeptabler Hash für Passwörter. Sie müssen nicht wechseln, wenn Sie dies nicht möchten (ab Version 7.2.0). Außerdem sollte PASSWORD_DEFAULT Nur in der nächsten vollständigen Version (7.3.0 oder höher) geändert werden (gemäß PHP Internals-Richtlinie ). Wenn Sie sicherstellen möchten, dass Sie nur mit bcrypt fortfahren, können Sie stattdessen PASSWORD_BCRYPT Verwenden. Dies ist jedoch nicht erforderlich, wie weiter unten erläutert wird.

Wie benutzt man Argon2?

Zuerst werden wir das zweite Argument von password_hash Auf eine dieser Konstanten umstellen

  • PASSWORD_ARGON2I - PHP 7.2.0+
  • PASSWORD_ARGON2ID - PHP 7.3.0+ (bevorzugt, falls verfügbar, siehe Anmerkungen unten)

und dann müssen wir unsere Optionen ändern. bcrypt verwendet cost als Parameter dafür, wie oft es über das Kennwort iteriert (höhere Kosten = längere Hashing-Zeit). Es gibt jedoch unterschiedliche Kostenfaktoren

password_hash('somepassword', PASSWORD_ARGON2I, ['memory_cost' => 2048, 'time_cost' => 4, 'threads' => 3]);

Aus dem Handbuch Wir sehen, was diese Optionen tun

  • memory_cost - Maximaler Speicher (in Byte), der zur Berechnung des Argon2-Hashs verwendet werden kann (Standard 1024)
  • time_cost - Maximale Zeitdauer für die Berechnung des Argon2-Hashs (Standard 2)
  • threads - Anzahl der Threads, die zum Berechnen des Argon2-Hash verwendet werden sollen (Standard 2)

Verstehen Sie, bevor Sie diese ändern, dass höhere Kosten hier Ihr Skript verlangsamen . Sie sollten einen Test auf Ihrem Server durchführen, um eine Einstellung zu finden, die für Sie am besten geeignet ist. Dies geschieht normalerweise durch Schleifen über mehrere Iterationen eines bestimmten Aufwandes. Das PHP-Handbuch gibt ein Beispiel dafür falls Sie eines brauchen.

Beachten Sie auch, dass bcrypt zwar 60 Zeichen speichert, Argon2 jedoch möglicherweise mehr benötigt. Idealerweise sollten Sie in Ihrem Kennwortfeld 255 Zeichen speichern.

Was ändern wir in password_verify?

Die Antwort hier ist ... nichts. Verstehen Sie, dass password_verify Klug genug ist, um herauszufinden, welcher Algorithmus verwendet wurde, und entsprechend damit umzugehen. Wie oben erwähnt, bedeutet dies, dass sich bei Verwendung von PASSWORD_DEFAULT Die Standardeinstellung ändern und Sie nicht negativ beeinflussen kann (obwohl Sie möglicherweise die Kostenparameter anpassen müssen). password_verify Benötigt lediglich einen von ihm unterstützten Algorithmus. Wenn Sie von bcrypt zu Argon2 wechseln, werden beide auf dieselbe Weise überprüft, da alle erforderlichen Daten (Salt, Hash und Kosten) für Sie gespeichert werden.

//Works for both bcrypt and Argon2
if(password_verify($user_password, $stored_hash)) {
    // password validated
}

Wenn Sie die Hashes von bcrypt aktualisieren möchten, können Sie dies tun, wenn sich ein Benutzer erfolgreich anmeldet (und Ihnen so das nicht gehashte Passwort mitgeteilt hat). Prüfen Sie einfach, ob Ihr Hash mit $2y$ (Dem bcrypt-Marker) beginnt. Wenn dies der Fall ist, übergeben Sie das angegebene Kennwort erneut an password_hash, Jedoch mit den Argon2-Argumenten, und speichern Sie es im Kennwortfeld des angemeldeten Benutzers.

Was ist Argon2ID?

Eingeführt in PHP 7. , Argon2ID führt einige Verbesserungen gegenüber Argon2I durch, wie in dieser Crypto.SE-Frage angegeben

Der beste Kompromiss bei Argon2id mit einem Durchgang ist der kombinierte Angriff mit geringem Speicherplatz (für die erste Hälfte des Speichers) und der Ranglistenangriff (für die zweite Hälfte), die den Faktor von ungefähr 2,1 zusammenfassen.

Argon2ID arbeitet mit den gleichen Argumenten wie Argon2I.

39
Machavity