Wie kann ich die Passwörter meiner Benutzer sicher speichern?
Wie viel mehr sicher ist diese als plain MD5? Ich habe gerade angefangen auf der Suche in Passwort-Sicherheit. Ich bin ziemlich neu bei PHP.
$salt = 'csdnfgksdgojnmfnb';
$password = md5($salt.$_POST['password']);
$result = mysql_query("SELECT id FROM users
WHERE username = '".mysql_real_escape_string($_POST['username'])."'
AND password = '$password'");
if (mysql_num_rows($result) < 1) {
/* Access denied */
echo "The username or password you entered is incorrect.";
}
else {
$_SESSION['id'] = mysql_result($result, 0, 'id');
#header("Location: ./");
echo "Hello $_SESSION[id]!";
}
InformationsquelleAutor der Frage Rebar | 2009-10-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einfachste Weg, um Ihre password storage scheme secure ist durch mit einem standard-Bibliothek.
Da die Sicherheit tendenziell viel komplizierter und mit mehr unsichtbar Schraube-up-Möglichkeiten als die meisten Programmierer konnten allein bewältigen, verwenden Sie eine standard-Bibliothek ist fast immer am einfachsten und sichersten (wenn nicht die einzige) option.
Der neuen PHP-API-Passwort (5.5.0+)
Wenn Sie mit der PHP-version 5.5.0 oder neuer verwenden, können Sie die neuen, vereinfachten Passwort-hashing-API
Beispiel-code durch die PHP password API:
(In Fall, dass Sie noch mit einem älteren 5.3.7 oder höher, die Sie installieren können ircmaxell/password_compatum Zugriff auf den build-in-Funktionen)
Verbesserung auf gesalzene hashes: Pfeffer
Wenn Sie zusätzliche Sicherheit, die security-Leute nun (2017) empfehlen das hinzufügen eines 'Pfeffer' , die (automatisch) gesalzene Passwort-hashes.
Gibt es einen einfachen, drop-in-Klasse, die sicher implementiert dieses Muster, ich empfehle:
Netsilik/PepperedPasswords
(github).
Es kommt mit einer MIT-Lizenz, so können Sie es verwenden, wie Sie wollen, auch in proprietären Projekten.
Beispiel-code mit
Netsilik/PepperedPasswords
:Die ALTEN standard-Bibliothek
Werfen Sie einen Blick auf: Portable PHP password hashing framework: phpass und stellen Sie sicher, dass Sie die
CRYPT_BLOWFISH
Algorithmus, wenn überhaupt möglich.Beispiel-code mit phpass (v0.2):
PHPass umgesetzt wurde, in einige Recht bekannte Projekte:
Die gute Sache ist, dass Sie nicht brauchen, um sorgen über die Daten, die programmiert worden sind, die von Menschen mit Erfahrung und überprüft werden, indem viele Leute auf das internet.
Weitere Informationen über Passwort-Speicher-Systeme, Lesen Jeff`s blog-post: Sie sind Wahrscheinlich die Speicherung der Passwörter Falsch
Was auch immer Sie tun, wenn Sie gehen für die "mache ich es selbst, danke " - Ansatz, nicht verwenden
MD5
oderSHA1
mehr. Sie sind schön hashing-Algorithmus, aber als gebrochen aus Sicherheitsgründen.Derzeit mit Kryptamit CRYPT_BLOWFISH ist die beste Praxis.
CRYPT_BLOWFISH in PHP ist eine Implementierung der Bcrypt hash. Bcrypt basiert auf dem Blowfish-Blockchiffre, Gebrauch machen, es ist teuer-key-setup zu langsam der Algorithmus nach unten.
InformationsquelleAutor der Antwort Jacco
Ihre Benutzer viel sicherer, wenn Sie parametrisierte Abfragen statt der Verkettung von SQL-Anweisungen. Und das Salz sollte für jeden Benutzer eindeutig und sollte gespeichert werden, zusammen mit dem Passwort-hash.
InformationsquelleAutor der Antwort Anton Gogolev
Bessere Weg wäre, für jeden Benutzer eine eindeutige Salz.
Den Vorteil, dass ein Salz ist, dass es macht es schwieriger für einen Angreifer zu pre-generieren der MD5-Signatur von jedem Wort aus dem Wörterbuch. Aber wenn ein Angreifer erfährt, dass Sie eine Feste Salz, so konnte Sie dann pre-generieren der MD5-Signatur von jedem Wort aus dem Wörterbuch vorangestellt ist, Ihre Feste Salz.
Ist es besser, jedes mal, wenn ein Benutzer sein Passwort ändert, ist Ihr system generiert einen zufälligen salt und speichern das Salz zusammen mit der Benutzer-Datensatz. Es macht es ein bisschen teurer, um das Passwort zu prüfen (da muss man suchen bis das Salz vor dem generieren der MD5-Signatur), aber es macht es viel schwieriger für einen Angreifer zu pre-MD5 generieren ist.
InformationsquelleAutor der Antwort R Samuel Klatchko
Mit PHP 5.5 (welche ich beschreibe, ist auch für frühere Versionen, siehe unten) um die Ecke ich würde gerne vorschlagen, um seine neuen, integrierten Lösung:
password_hash()
undpassword_verify()
. Es bietet mehrere Optionen, um zu erreichen das Niveau der Passwort-Sicherheit, die Sie brauchen (zum Beispiel durch Angabe von "Kosten" - parameter durch die$options
array)zurück
Als könnten Sie sehen, enthält der string das Salz sowie die Kosten, die angegeben wurde, in den Optionen. Es enthält auch den Algorithmus verwendet.
Daher, bei der überprüfung des Passworts (beispielsweise wenn der Benutzer sich anmeldet), wenn Sie die kostenlosen
password_verify()
Funktion, wird es extrahieren Sie die notwendigen crypto-Parameter aus dem Passwort-hash selbst.Wenn Sie nicht angeben, ein Salz, das generierte Passwort-hash wird anders sein auf jedem Aufruf der
password_hash()
denn der salt zufällig generiert. Daher der Vergleich eines vorherigen Hashwert mit einem neu erzeugten Fehler auf, selbst für Sie das richtige Passwort ein.Überprüfung funktioniert so:
Ich hoffe, dass durch diesen integrierten Funktionen wird bald besser Passwort-Sicherheit im Fall von Daten-Diebstahl, wie es reduziert die Menge des Denkens, die der Programmierer hat, um in eine ordnungsgemäße Umsetzung.
Gibt es eine kleine Bibliothek (eine PHP Datei), geben Sie PHP 5.5
password_hash
in PHP 5.3.7+: https://github.com/ircmaxell/password_compatInformationsquelleAutor der Antwort akirk
Das ist in Ordnung mit mir. Mr Atwood schrieb über die Stärke der MD5-gegen rainbow-Tabellenund im Grunde mit einem langen, Salz, wie, dass Sie sitzen ziemlich (obwohl einige random Satzzeichen/zahlen, könnte es zu verbessern).
Könnte man auch schauen, SHA-1, die scheint, werden immer beliebter in diesen Tagen.
InformationsquelleAutor der Antwort nickf
Möchte ich noch hinzufügen:
Zur Kompatibilität mit alten Systemen ist oft eine Obergrenze für die maximale Länge des Passworts. Dies ist eine schlechte Sicherheitspolitik: wenn Sie die Beschränkung, setzen es nur für die minimale Länge der Passwörter.
Für die Wiederherstellung eines vergessenen Passwortes senden Sie die Adresse ein, mit der Benutzer das Kennwort ändern kann.
Den Passwort-hash können veraltet sein (Parameter des Algorithmus aktualisiert werden können). Mit der Funktion
password_needs_rehash()
Sie können check it out.InformationsquelleAutor der Antwort Aleksey Bykov