web-dev-qa-db-fra.com

Comment créer et stocker des mots de passe md5 dans mysql

Probablement une question très récente, mais j’ai lu et j’ai eu du mal à comprendre la création et le stockage des mots de passe. D'après ce que j'ai lu, les mots de passe md5/hash sont le meilleur moyen de les stocker dans une base de données. Cependant, comment pourrais-je créer ces mots de passe en premier lieu?

Alors disons que j'ai une page de connexion avec l'utilisateur bob et le mot de passe bob123 - comment vais-je 1. récupère le mot de passe bobs dans la base de données pour commencer (haché) 2. Comment puis-je récupérer et confirmer le mot de passe haché?

Merci

22
Fahad

Edit 2017/11/09: Jetez un coup d'œil à la réponse de O Jones.

Tout d’abord, MD5 n’est pas la meilleure méthode de hachage que vous puissiez utiliser pour cet essai. Sha256 ou sha512

Cela dit, utilisons hash('sha256') au lieu de md5() pour représenter la partie de hachage du processus.

Lorsque vous créez un nom d'utilisateur et un mot de passe pour la première fois, vous hachez le mot de passe brut avec un peu de sel (des caractères supplémentaires aléatoires sont ajoutés à chaque mot de passe pour les rendre plus longs/plus forts).

Cela pourrait ressembler à quelque chose comme ceci venant du formulaire de création d'utilisateur:

$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'); ";

Ensuite, lors de la connexion, cela ressemblera à ceci:

$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

vous devez raisonner en termes de mot de passe hased:

enregistrer le mot de passe sous la forme md5('bob123'); lorsque Bob est enregistré dans votre application

$query = "INSERT INTO users (username,password) VALUES('bob','".md5('bob123')."');

puis, quand Bob se connecte:

$query = "SELECT * FROM users WHERE username = 'bob' AND password = '".md5('bob123')."';

obvioulsy utilise des variables pour le nom d'utilisateur et le mot de passe, ces requêtes sont générées par php et vous pouvez ensuite les exécuter sur mysql

9
Dalen

Veuillez ne pas utiliser MD5 pour le hachage du mot de passe. Ces mots de passe peuvent être déchiffrés en quelques millisecondes. Vous êtes sûr d'être victime de cybercriminels.

PHP propose un sous-système de hachage de mots de passe de haute qualité et évolutif basé sur un salt aléatoire fiable et plusieurs tours de cryptage Rijndael/AES. 

Lorsqu'un utilisateur fournit un mot de passe pour la première fois, vous pouvez le hacher comme ceci:

 $pass = 'whatever the user typed in';
 $hashed_password = password_hash( "secret pass phrase", PASSWORD_DEFAULT );

Enregistrez ensuite $hashed_password dans une colonne varchar(255) dans MySQL. Plus tard, lorsque l'utilisateur souhaite se connecter, vous pouvez récupérer le mot de passe haché de MySQL et le comparer au mot de passe que l'utilisateur a proposé de se connecter.

 $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 */
 }

Comment fonctionne cette mise à l'épreuve du temps? Les futures versions de PHP s'adapteront pour permettre un cryptage plus rapide et plus facile. S'il est nécessaire de ressasser les mots de passe pour les rendre plus difficiles à déchiffrer, la future implémentation de la fonction password_needs_rehash() le détectera.

Ne réinventez pas le pneu crevé. Utilisez du code source ouvert conçu par des professionnels et approuvé pour des raisons de sécurité.

6
O. Jones

Insertion:

INSERT INTO ... VALUES ('bob', MD5('bobspassword'));

récupération:

SELECT ... FROM ... WHERE ... AND password=md5('hopefullybobspassword');

est comment vous le feriez directement dans les requêtes. Cependant, si la journalisation des requêtes est activée dans votre MySQL, le texte en clair des mots de passe sera écrit dans ce journal. Alors ... vous voudriez faire la conversion MD5 dans votre script, puis insérer le hachage résultant dans la requête.

5
Marc B

PHP a une méthode appelée md5 ;-) Juste $ password = md5 ($ passToEncrypt);

Si vous recherchez dans un langage SQL, vous pouvez également utiliser une méthode MySQL, méthode MD5 () ....

 SELECT * FROM user WHERE Password='. md5($password) .'

ou SELECT * FROM ser WHERE Mot de passe = MD5 ('. $ Mot de passe.')

Pour l'insérer, vous pouvez le faire de la même manière.

3
Smokefoot

Pourquoi n'utilisez-vous pas le hasher de mot de passe MySQL intégré:

http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html

mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass')                        |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+

à titre de comparaison, vous pourriez quelque chose comme ceci:

select id from PassworTable where Userid='<userid>' and Password=PASSWORD('<password>')

et si elle retourne une valeur, l'utilisateur est correct.

3
Lucian

Je ne suis pas incroyable en PHP, mais je pense que c'est ce que vous faites:

$ password = md5 ($ password)

et $password serait le $_POST['password'] ou quoi que

2
Taimur

Pour augmenter encore plus la sécurité, vous pouvez utiliser le cryptage md5 avec deux chaînes de sel différentes, un sel statique défini dans un fichier php et un autre sel unique généré de manière aléatoire pour chaque enregistrement de mot de passe.

Voici comment vous pouvez générer le sel, la chaîne md5 et le stocker:

    $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."');

Vous avez maintenant un sel statique, qui est valable pour tous vos mots de passe, qui est stocké dans le fichier .php. Ensuite, lors de l'exécution de l'enregistrement, vous générez un hachage unique pour ce mot de passe spécifique.

Tout cela se termine avec: deux mots de passe qui sont orthographiés exactement les mêmes, auront deux hachages différents. Le hachage unique est stocké dans la base de données avec l'identifiant actuel. Si quelqu'un récupère la base de données, il aura chaque sel unique pour chaque mot de passe spécifique. Mais ce qu’ils n’ont pas, c’est votre sel statique, qui rend les choses beaucoup plus difficiles pour tous les "hackers".

Voici comment vérifier la validité de votre mot de passe sur login.php, par exemple:

     $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]);
}

Cette méthode est très puissante et sécurisée. Si vous souhaitez utiliser le chiffrement sha512, il suffit de l'insérer dans la fonction de hachage au lieu de md5 dans le code ci-dessus.

0
B.S.B.

récupérez simplement le hachage en suivant la ligne et stockez-le dans la base de données:

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