wake-up-neo.com

Wie erstelle und speichere ich md5-Passwörter in mysql?

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

22
Fahad

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
43
JohnKlehm

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

9
Dalen

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.

6
O. Jones

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.

5
Marc B

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.

3
Smokefoot

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.

3
Lucian

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

2
Taimur

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.

0
B.S.B.

holen Sie sich den Hash einfach durch folgende Zeile und speichern Sie ihn in der Datenbank:

$encryptedValue = md5("YOUR STRING");
0
Faisal Shaikh