Wahrscheinlich eine sehr neue Frage, aber ich habe etwas gelesen und habe Schwierigkeiten beim Verständnis der Erstellung und Speicherung von Passwörtern gefunden. Von dem, was ich gelesen habe, sind md5/hash-Kennwörter die besten Möglichkeiten, sie in einer Datenbank zu speichern. Wie würde ich diese Passwörter jedoch erst erstellen?
Angenommen, ich habe eine Anmeldeseite mit dem Benutzer bob und dem Kennwort bob123 - Wie werde ich 1. bobs-Passwort in die Datenbank aufnehmen (hashed) 2. Wie kann ich das Hash-Passwort abrufen und bestätigen?
Vielen Dank
Edit 2017/11/09: Schauen Sie sich die Antwort von O Jones an.
Zunächst einmal ist MD5 nicht die beste Hashmethode, die Sie für diesen Versuch verwenden können: sha256 oder sha512
Das heißt, verwenden wir hash('sha256')
anstelle von md5()
, um den Hash-Teil des Prozesses darzustellen.
Wenn Sie zum ersten Mal einen Benutzernamen und ein Kennwort erstellen, müssen Sie das unformatierte Kennwort mit einem Salt-Zeichen versehen (einige zufällige zusätzliche Zeichen werden hinzugefügt, um sie länger/stärker zu machen).
Könnte in etwa so aussehen, als wenn Sie das Benutzerformular erstellen:
$escapedName = mysql_real_escape_string($_POST['name']); # use whatever escaping function your db requires this is very important.
$escapedPW = mysql_real_escape_string($_POST['password']);
# generate a random salt to use for this account
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
$saltedPW = $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);
$query = "insert into user (name, password, salt) values ('$escapedName', '$hashedPW', '$salt'); ";
Beim Einloggen sieht es dann ungefähr so aus:
$escapedName = mysql_real_escape_string($_POST['name']);
$escapedPW = mysql_real_escape_string($_POST['password']);
$saltQuery = "select salt from user where name = '$escapedName';";
$result = mysql_query($saltQuery);
# you'll want some error handling in production code :)
# see http://php.net/manual/en/function.mysql-query.php Example #2 for the general error handling template
$row = mysql_fetch_assoc($result);
$salt = $row['salt'];
$saltedPW = $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);
$query = "select * from user where name = '$escapedName' and password = '$hashedPW'; ";
# if nonzero query return then successful login
sie müssen in Bezug auf das Passwort ein Argument angeben:
speichern Sie das Kennwort als md5('bob123');
, wenn Bob in Ihrer App registriert ist
$query = "INSERT INTO users (username,password) VALUES('bob','".md5('bob123')."');
dann, wenn Bob sich anmeldet:
$query = "SELECT * FROM users WHERE username = 'bob' AND password = '".md5('bob123')."';
obvioulsy verwendet Variablen für Benutzername und Passwort. Diese Abfragen werden von PHP generiert und können dann unter mysql ausgeführt werden
Bitte verwenden Sie kein MD5 für Passwort-Hashing. Solche Passwörter können in Millisekunden geknackt werden. Sie werden sicher von Cyberkriminellen verurteilt.
PHP bietet ein hochwertiges und zukunftssicheres Passwort-Hashing-Subsystem , das auf einem zuverlässigen Zufalls-Salt und mehreren Runden von Rijndael/AES-Verschlüsselung basiert.
Wenn ein Benutzer zum ersten Mal ein Passwort angibt, können Sie es wie folgt abhaken:
$pass = 'whatever the user typed in';
$hashed_password = password_hash( "secret pass phrase", PASSWORD_DEFAULT );
Speichern Sie dann $hashed_password
in einer varchar(255)
-Spalte in MySQL. Wenn sich der Benutzer später anmelden möchte, können Sie das Hash-Kennwort von MySQL abrufen und mit dem Kennwort vergleichen, das der Benutzer zur Anmeldung angeboten hat.
$pass = 'whatever the user typed in';
$hashed_password = 'what you retrieved from MySQL for this user';
if ( password_verify ( $pass , $hashed_password )) {
/* future proof the password */
if ( password_needs_rehash($hashed_password , PASSWORD_DEFAULT)) {
/* recreate the hash */
$rehashed_password = password_hash($pass, PASSWORD_DEFAULT );
/* store the rehashed password in MySQL */
}
/* password verified, let the user in */
}
else {
/* password not verified, tell the intruder to get lost */
}
Wie funktioniert diese Zukunftssicherung? Zukünftige Versionen von PHP werden angepasst, um die Verschlüsselung schneller und einfacher zu knacken. Wenn es erforderlich ist, Kennwörter erneut zu wärmen, um sie schwieriger zu knacken, wird dies bei der zukünftigen Implementierung der Funktion password_needs_rehash()
erkannt.
Erzeuge den Reifen nicht neu. Verwenden Sie zur Sicherheit professionell gestalteten und überprüften Open Source-Code.
Einfügung:
INSERT INTO ... VALUES ('bob', MD5('bobspassword'));
abruf:
SELECT ... FROM ... WHERE ... AND password=md5('hopefullybobspassword');
so würden Sie es direkt in den Abfragen tun. Wenn in MySQL jedoch die Abfrageprotokollierung aktiviert ist, wird der Klartext der Kennwörter in dieses Protokoll geschrieben. Sie möchten also die MD5-Konvertierung in Ihrem Skript durchführen und dann den resultierenden Hash in die Abfrage einfügen.
PHP hat eine Methode namens md5 ;-) Just $ password = md5 ($ passToEncrypt);
Wenn Sie in einer SQL-Suche suchen, können Sie auch eine MySQL-Methode MD5 () verwenden.
SELECT * FROM user WHERE Password='. md5($password) .'
oder SELECT * FROM ser WHERE Kennwort = MD5 ('. $ Kennwort.')
Zum Einfügen können Sie es auf die gleiche Weise tun.
Warum verwenden Sie nicht den in MySQL integrierten Kennwort-Hasher:
http://dev.mysql.com/doc/refman/5.1/de/password-hashing.html
mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
zum Vergleich könnte man so etwas sagen:
select id from PassworTable where Userid='<userid>' and Password=PASSWORD('<password>')
und wenn es einen Wert zurückgibt, ist der Benutzer korrekt.
Ich bin nicht fantastisch bei PHP, aber ich denke, dass Sie Folgendes tun:
$ password = md5 ($ password)
und $password
wäre der $_POST['password']
oder was auch immer
Um die Sicherheit noch weiter zu erhöhen, können Sie die md5-Verschlüsselung zusammen mit zwei verschiedenen Salt-Strings verwenden, einen statischen Salt-Code, der in der PHP-Datei definiert ist, und dann einen weiteren zufällig generierten eindeutigen Salt-Code für jeden Kennworteintrag.
So können Sie Salt, MD5-String erzeugen und speichern:
$unique_salt_string = hash('md5', microtime());
$password = hash('md5', $_POST['password'].'static_salt'.$unique_salt_string);
$query = "INSERT INTO users (username,password,salt) VALUES('bob','".$password."', '".$unique_salt_string."');
Jetzt haben Sie ein statisches Salt, das für alle Ihre Passwörter gilt und in der .php-Datei gespeichert ist. Bei der Registrierungsausführung generieren Sie dann einen eindeutigen Hash für dieses bestimmte Kennwort.
Das alles endet mit: Zwei Passwörter, die genau gleich geschrieben werden, haben zwei verschiedene Hashes. Der eindeutige Hash wird zusammen mit der aktuellen ID in der Datenbank gespeichert. Wenn sich jemand die Datenbank holt, hat er für jedes spezifische Passwort jedes einzelne Salz. Was sie nicht haben, ist Ihr statisches Salz, was die Dinge für jeden "Hacker" da draußen schwieriger macht.
So überprüfen Sie beispielsweise die Gültigkeit Ihres Passworts in login.php:
$user = //username input;
$db_query = mysql_query("SELECT salt FROM users WHERE username='$user'");
while($salt = mysql_fetch_array($db_query)) {
$password = hash('md5',$_POST['userpassword'].'static_salt'.$salt[salt]);
}
Diese Methode ist sehr leistungsfähig und sicher. Wenn Sie die sha512-Verschlüsselung verwenden möchten, fügen Sie die Hash-Funktion anstelle von md5 im obigen Code ein.
holen Sie sich den Hash einfach durch folgende Zeile und speichern Sie ihn in der Datenbank:
$encryptedValue = md5("YOUR STRING");