Comment créer et stocker des mots de passe md5 dans mysql
probablement une question très nouvelle mais, J'ai lu autour et ai trouvé une certaine difficulté à 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 les meilleurs moyens de les stocker dans une base de données. Cependant, comment pourrais-je créer ces mots de passe en premier lieu?
ainsi, disons que j'ai une page de connexion avec l'utilisateur bob, et le mot de passe bob123 - comment vais-je 1. obtenir le mot de passe bobs dans la base de données pour commencer avec () 2. comment puis-je retrive et confirmer le mot de passe haché?
Merci
9 réponses
Modifier 2017/11/09: assurez-vous de prendre un coup d'oeil à la réponse de S Jones.
tout D'abord MD5 N'est pas la meilleure méthode de hachage que vous pourriez utiliser pour cela essayer sha256 ou sha512
cela dit utilisons hash('sha256')
au lieu de md5()
pour représenter le hachage partie 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 (quelques caractères supplémentaires ajoutés au hasard à chaque mot de passe pour les rendre plus fortes).
peut ressembler à quelque chose comme ceci venant du formulaire Créer 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'); ";
puis sur la connexion il ressemblera à quelque chose comme 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
vous avez à raisonner en termes de hased mot de passe:
enregistrer le mot de passe md5('bob123');
quand bob s'inscrit à 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')."';
utilisation évidente de variables pour le nom d'utilisateur et le mot de passe, ces requêtes sont générées par php et ensuite vous pouvez les exécuter sur mysql
S'il vous plaît n'utilisez pas MD5 pour le hachage de mot de passe. Ces mots de passe peuvent être crackés en millisecondes. Vous êtes sûr d'être attaqué par des cybercriminels.
PHP offre un de haute qualité et de l'avenir de hachage de mot de passe de sous-système basé sur un sel aléatoire fiable et plusieurs rounds de cryptage Rijndael / AES.
Quand un utilisateur fournit d'abord un mot de passe vous pouvez hachage comme ceci:
$pass = 'whatever the user typed in';
$hashed_password = password_hash( "secret pass phrase", PASSWORD_DEFAULT );
Puis, magasin $hashed_password
dans un varchar(255)
colonne dans MySQL. Tard, quand l'utilisateur veut se connecter, vous pouvez récupérer le mot de passe hashé de MySQL et le comparer au mot de passe que l'Utilisateur a offert 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 fonction de vérification de l'avenir? Les futures versions de PHP s'adapteront pour correspondre plus vite et plus facile à déchiffrer le cryptage. S'il est nécessaire de ressasser les mots de passe pour les rendre plus difficiles à déchiffrer, la future implémentation du password_needs_rehash()
fonction détecte que.
ne réinventez pas le pneu crevé. Utiliser code source ouvert conçu et testé par des professionnels pour la sécurité.
Insertion:
INSERT INTO ... VALUES ('bob', MD5('bobspassword'));
récupération:
SELECT ... FROM ... WHERE ... AND password=md5('hopefullybobspassword');
comment avez-vous ferais directement dans les requêtes. Cependant, si votre MySQL a activé la journalisation des requêtes, alors le texte en clair des mots de passe sera écrit dans ce journal. Si... vous voulez faire la conversion MD5 dans votre script, et ensuite insérer ce hachage résultant dans la requête.
PHP a une méthode appelée md5 ;-) Just $password = md5($passToEncrypt);
si vous cherchez dans un SQL u peut utiliser une méthode MySQL MD5() aussi....
SELECT * FROM user WHERE Password='. md5($password) .'
ou Sélectionnez * dans ser où Password=MD5('. $mot de passe .')
Pour insérer u peut faire la même façon.
pourquoi ne pas utiliser le MySQL construit dans le hasher de mot de passe:
http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html
mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
a titre de comparaison vous pourriez quelque chose comme ceci:
select id from PassworTable where Userid='<userid>' and Password=PASSWORD('<password>')
et si elle renvoie une valeur, alors l'utilisateur est correct.
Je ne suis pas incroyable à PHP, mais je pense que c'est ce que vous faites:
$ password = md5 ($password)
et $password
sera le $_POST['password']
ou que ce soit
il suffit d'obtenir le hachage en suivant la ligne et de le stocker dans la base de données:
$encryptedValue = md5("YOUR STRING");
pour augmenter la sécurité encore plus, vous pouvez avoir le cryptage md5 avec deux chaînes de sel différentes, un sel statique défini dans le fichier php et puis un sel unique généré de plus au hasard pour chaque enregistrement de mot de passe.
$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."');
Maintenant vous avez un sel statique, qui est valide 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 le mot de passe.
tout cela se termine par: deux mots de passe qui sont épelés exactement de la même façon, auront deux hachages différents. Le hachage unique est stocké dans la base de données avec l'id courant. Si quelqu'un saisit 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 chaque "hacker" là-bas.
C'est comment vous vérifiez la validité de votre mot de passe à la connexion.php pour 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ûre. Si vous voulez utiliser le cryptage sha512, juste pour mettre cela dans la fonction de hachage au lieu de md5 dans le code ci-dessus.