53 Stimmen

PHP-Best Practices für Benutzerauthentifizierung und Passwortsicherheit

Was sind die besten aktuellen Bibliotheken/Methoden zur Authentifizierung von Benutzern ohne den Einsatz eines CMS oder eines schweren Frameworks?

Die Antworten sollten Vorschläge für alles enthalten, was Ihrer Meinung nach als Standard für neue PHP-Entwicklungen mit Benutzerauthentifizierung gelten sollte.

29voto

Daren Schwenke Punkte 5298

OpenID ist eine Methode zur Authentifizierung von Benutzern auf der Grundlage ihrer bestehenden Konten bei gängigen Webdiensten wie Yahoo, Google und Flickr.

Die Anmeldung bei Ihrer Website basiert auf einer erfolgreichen Anmeldung bei der entfernten Website.

Sie müssen keine sensiblen Benutzerdaten speichern oder SSL verwenden, um Benutzeranmeldungen zu sichern.

Eine aktuelle PHP-Version der Bibliothek finden Sie unter aquí .

19voto

Scott Arciszewski Punkte 32074

Implementierung der Benutzerauthentifizierung sicher ohne sich auf ein Framework (oder eine Bibliothek eines Drittanbieters, wie OpenID) zu verlassen, ist kein triviales Unterfangen.

Bei einem Überblick über 10.000 Fuß müssen Sie sich entscheiden:

  • Haben Sie Benutzernamen, E-Mail-Adressen oder Benutzer-IDs als primären Selektor?
  • Wie sollten Sie Kennwörter speichern? PROTIP: password_hash() o scrypt sind der richtige Weg.
  • Wie sollten Sie mit "Erinnerungs-Kontrollkästchen" umgehen? Dafür gibt es im Internet eine Menge schlechter Strategien. Behandeln Sie jede davon mit Skepsis, denn sie könnten Schwachstellen in Ihre Anwendung einführen.
  • Wie soll die Anwendung mit Benutzern umgehen, die ihr Passwort vergessen haben?

Die Informationen in dieser Antwort sind relevant und auf dem Stand vom 9. Mai 2015 und könnten durch den Abschluss des Verfahrens überholt sein. Passwort-Hashing-Wettbewerb

Primäre Selektoren

Im Allgemeinen sind Benutzernamen und E-Mail-Adressen besser als ID-Nummern.

Es sollte keine Sicherheitsanforderung für die Geheimhaltung von Benutzernamen geben, da diese in der Praxis ohnehin durchgesickert sind, wenn jemand versucht, sich zu registrieren.

Sie können entscheiden, ob E-Mail-Adressen als geheim behandelt werden sollen oder nicht. Die Benutzer möchten im Allgemeinen nicht Spammern, Betrügern und Trollen ausgesetzt sein.

Passwort-Hashing

Sie sollten Folgendes verwenden password_hash() y password_verify() es sei denn, Sie sind ausreichend erfahren im Schreiben von Kryptographie-Bibliotheken, um darüber hinauszugehen.

Jenseits von Bcrypt

Manchmal werden Entwickler gerne kreativ (z. B. fügen sie einen "Pfeffer" hinzu, was in der Regel Pre-Hashing oder HMACing von Passwörtern mit einem statischen Schlüssel bedeutet) und gehen über die Standardimplementierungen hinaus. Wir selbst haben dies getan, allerdings sehr konservativ.

Für unsere internen Projekte (die ein viel höheres Maß an Sicherheit aufweisen als die Blogs der meisten Leute) haben wir einen Wrapper um diese API geschrieben, der PasswordLock das ein Kennwort zunächst mit einem Hashwert sha256 kodiert dann die rohe Hash-Ausgabe in base64 und übergibt diesen base64-kodierten Hash an password_hash() und verschlüsselt schließlich den bcrypt-Hash mit eine ordnungsgemäß implementierte Verschlüsselungsbibliothek .

Um es noch einmal zu wiederholen, Anstatt zu pfeffern, verschlüsseln wir unsere Passwort-Hashes. Dies gibt uns mehr Flexibilität im Falle eines Lecks (wir können entschlüsseln und wieder verschlüsseln, weil wir den Schlüssel kennen). Außerdem können wir unseren Webserver und unsere Datenbank auf separater Hardware im selben Rechenzentrum betreiben, um die Auswirkungen einer SQL-Injection-Schwachstelle abzuschwächen. (Um mit dem Knacken von Hashes beginnen zu können, benötigen Sie den AES-Schlüssel. Sie können ihn nicht von der Datenbank bekommen, selbst wenn Sie in das Dateisystem eindringen).

// Storage:
$stored = \ParagonIE\PasswordLock\PasswordLock::hashAndEncrypt($password, $aesKey);

// Verification:
if (\ParagonIE\PasswordLock\PasswordLock::decryptAndVerify($password, $stored, $aesKey)) {
    // Authenticated!
}

Passwortspeicherung mit PasswordLock :

  1. hash('sha256', $password, true);
  2. base64_encode($step1);
  3. password_hash($step2, PASSWORD_DEFAULT);
  4. Crypto::encrypt($step3, $secretKey);

Passwortüberprüfung mit PasswordLock :

  1. Crypto::decrypt($ciphertext, $secretKey);
  2. hash('sha256', $password, true);
  3. base64_encode($step2);
  4. password_verify($step3, $step1);

Weitere Lektüre

11voto

Martin York Punkte 245363

を使用しています。 OpenID .

Aber wie Stackoverflow verwende ich das Google-Projekt openid-selector um die schwere Arbeit zu erledigen.
Demo-Seite aquí .

Die offensichtlichen Vorteile (von OpenID) sind.

  • Sie müssen kein Sicherheitsexperte sein.
  • Die Nutzer vertrauen den großen Websites ihre Daten an.
  • Sie können Dinge wie (Nickname usw.) abfragen, aber der Benutzer muss zustimmen.
  • Sie brauchen sich keine Sorgen zu machen:
    • Registrierungsverfahren
    • verlorenes/vergessenes Passwort

9voto

DougW Punkte 26369

Es gibt hier viele gute Antworten, aber ich denke, es lohnt sich, dies zu sagen. Versuchen Sie NICHT, das Rad neu zu erfinden in diesem Fall! Es ist extrem einfach, die Benutzerauthentifizierung auf verschiedenste Weise zu vermasseln. Es sei denn, Sie realmente eine maßgeschneiderte Lösung benötigen, und eine Firma Wenn Sie keine Kenntnisse über Sicherheitssysteme und bewährte Verfahren haben, werden Sie mit ziemlicher Sicherheit Sicherheitsmängel haben.

OpenID ist großartig, oder wenn Sie Ihre eigene Bibliothek erstellen, verwenden Sie zumindest eine etablierte Bibliothek und folgen Sie der Dokumentation!

8voto

Daren Schwenke Punkte 5298

PHPass ist eine leichtgewichtige Passwort-Hashing-Bibliothek mit variablen Kosten, die bcrypt verwendet.

Variable Kosten bedeuten, dass Sie später die "Kosten" für das Hashing von Passwörtern erhöhen können, um die Sicherheit nahtlos zu erhöhen, ohne dass Sie Ihre zuvor gehashten Benutzerpasswörter ungültig machen müssen.

Die für die Hash-Speicherung verwendete Feldgröße bleibt auch bei einer Erhöhung der "Kosten" konstant, da nicht die Größe des Hashes, sondern die Anzahl der für seine Erstellung erforderlichen Iterationen erhöht wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X