Wie viel sicherer ist das als normales MD5 ? Ich habe gerade angefangen, mich mit der Passwortsicherheit zu befassen. Ich bin ziemlich neu in 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]!";
}
Antworten:
Der einfachste Weg, um Ihr Passwortspeicherschema sicher zu machen, ist die Verwendung einer Standardbibliothek .
Da die Sicherheit in der Regel viel komplizierter ist und unsichtbarere Möglichkeiten bietet, als die meisten Programmierer allein in Angriff nehmen könnten, ist die Verwendung einer Standardbibliothek fast immer die einfachste und sicherste (wenn nicht die einzige) verfügbare Option.
Die neue PHP-Passwort-API (5.5.0+)
Wenn Sie PHP Version 5.5.0 oder höher verwenden, können Sie die neue vereinfachte Passwort-Hashing-API verwenden
Beispiel für Code mit der PHP-Passwort-API:
(Falls Sie noch Legacy 5.3.7 oder höher verwenden, können Sie ircmaxell / password_compat installieren , um Zugriff auf die integrierten Funktionen zu erhalten.)
Verbesserung der gesalzenen Hashes: Pfeffer hinzufügen
Wenn Sie zusätzliche Sicherheit wünschen, empfehlen die Sicherheitsleute jetzt (2017) , den (automatisch) gesalzenen Passwort-Hashes einen " Pfeffer " hinzuzufügen .
Es gibt eine einfache Drop-in-Klasse, die dieses Muster sicher implementiert. Ich empfehle: Netsilik / PepperedPasswords ( github ).
Es wird mit einer MIT-Lizenz geliefert, sodass Sie es auch in proprietären Projekten verwenden können, wie Sie möchten.
Beispiel für Code mit
Netsilik/PepperedPasswords
:Die ALTE Standardbibliothek
Schauen Sie sich an: Portable PHP Password Hashing Framework : phpass und stellen Sie sicher, dass Sie den
CRYPT_BLOWFISH
Algorithmus verwenden, wenn dies überhaupt möglich ist.Beispiel für Code mit phpass (v0.2):
PHPass wurde in einigen bekannten Projekten implementiert:
Das Gute ist, dass Sie sich keine Gedanken über die Details machen müssen. Diese Details wurden von erfahrenen Personen programmiert und von vielen Leuten im Internet überprüft.
Weitere Informationen zu Kennwortspeicherschemata finden Sie in Jeffs Blogbeitrag: Sie speichern Kennwörter wahrscheinlich falsch
Was auch immer Sie tun, wenn Sie sich für den Ansatz " Ich mache es selbst, danke " entscheiden, verwenden Sie ihn nicht mehr
MD5
oderSHA1
nicht mehr . Sie sind nette Hashing-Algorithmen, werden aber aus Sicherheitsgründen als defekt angesehen .Derzeit ist die Verwendung von Krypta mit CRYPT_BLOWFISH die beste Vorgehensweise.
CRYPT_BLOWFISH in PHP ist eine Implementierung des Bcrypt-Hash. Bcrypt basiert auf der Blowfish-Blockverschlüsselung und nutzt das teure Schlüssel-Setup, um den Algorithmus zu verlangsamen.
quelle
Ihre Benutzer sind viel sicherer, wenn Sie parametrisierte Abfragen verwenden, anstatt SQL-Anweisungen zu verketten. Und das Salz sollte für jeden Benutzer eindeutig sein und zusammen mit dem Passwort-Hash gespeichert werden.
quelle
Ein besserer Weg wäre, dass jeder Benutzer ein einzigartiges Salz hat.
Der Vorteil eines Salzes besteht darin, dass es für einen Angreifer schwieriger ist, die MD5-Signatur jedes Wörterbuchworts vorab zu generieren. Wenn ein Angreifer jedoch erfährt, dass Sie ein festes Salz haben, kann er die MD5-Signatur jedes Wörterbuchworts vorab generieren, dem Ihr festes Salz vorangestellt ist.
Ein besserer Weg ist, dass jedes Mal, wenn ein Benutzer sein Kennwort ändert, Ihr System ein zufälliges Salz generiert und dieses Salz zusammen mit dem Benutzerdatensatz speichert. Es macht es etwas teurer, das Passwort zu überprüfen (da Sie das Salt nachschlagen müssen, bevor Sie die MD5-Signatur generieren können), aber es macht es für einen Angreifer viel schwieriger, MD5s vorab zu generieren.
quelle
crypt()
Funktion). Und da Sie den Passwort-Hash trotzdem abrufen müssen, wird die Verwendung eines benutzerspezifischen Salt das Verfahren nicht teurer. (Oder meintest du, ein neues zufälliges Salz zu erzeugen ist teuer? Ich glaube nicht wirklich.) Sonst +1.Mit PHP 5.5 (was ich beschreibe, ist auch für frühere Versionen verfügbar, siehe unten) um die Ecke möchte ich vorschlagen, die neue, integrierte Lösung zu verwenden:
password_hash()
undpassword_verify()
. Es bietet verschiedene Optionen, um die erforderliche Kennwortsicherheit zu erreichen (z. B. durch Angabe eines "Kosten" -Parameters über das$options
Array).wird zurückkehren
Wie Sie vielleicht sehen, enthält die Zeichenfolge das Salz sowie die Kosten, die in den Optionen angegeben wurden. Es enthält auch den verwendeten Algorithmus.
Wenn Sie das Kennwort überprüfen (z. B. wenn sich der Benutzer anmeldet) und die kostenlose
password_verify()
Funktion verwenden, werden daher die erforderlichen Kryptoparameter aus dem Kennwort-Hash selbst extrahiert.Wenn kein Salt angegeben wird, unterscheidet sich der generierte Passwort-Hash bei jedem Aufruf von,
password_hash()
da das Salt zufällig generiert wird. Daher schlägt der Vergleich eines vorherigen Hashs mit einem neu generierten fehl, selbst bei einem korrekten Passwort.Die Überprüfung funktioniert folgendermaßen:
Ich hoffe, dass die Bereitstellung dieser integrierten Funktionen bald eine bessere Kennwortsicherheit im Falle eines Datendiebstahls bietet, da dadurch weniger Gedanken aufgewendet werden müssen, die der Programmierer für eine ordnungsgemäße Implementierung benötigt.
Es gibt eine kleine Bibliothek (eine PHP-Datei), die Ihnen PHP 5.5
password_hash
in PHP 5.3.7+ bietet: https://github.com/ircmaxell/password_compatquelle
password_hash()
undpassword_verify
egal welches Passwort (richtig oder nicht) ich verwendet habe, am Ende habe ich das richtige PasswortDas ist okay für mich. Herr Atwood schrieb über die Stärke von MD5 gegen Regenbogentische , und im Grunde genommen sitzen Sie mit einem langen Salz wie diesem hübsch (obwohl einige zufällige Satzzeichen / Zahlen es verbessern könnten).
Sie können sich auch SHA-1 ansehen, das heutzutage immer beliebter zu werden scheint.
quelle
Ich will hinzufügen:
Legen Sie aus Gründen der Kompatibilität mit alten Systemen häufig eine Grenze für die maximale Länge des Kennworts fest. Dies ist eine schlechte Sicherheitsrichtlinie: Wenn Sie eine Einschränkung festlegen, legen Sie diese nur für die Mindestlänge von Kennwörtern fest.
Um ein vergessenes Passwort wiederherzustellen, sollten Sie die Adresse senden, unter der der Benutzer das Passwort ändern kann.
Der Passwort-Hash ist möglicherweise veraltet (Parameter des Algorithmus werden möglicherweise aktualisiert). Mit der Funktion können
password_needs_rehash()
Sie es überprüfen.quelle