J'ai un petit site Web communautaire et j'ai besoin d'implémenter une sorte de fonction de mot de passe oublié. Je stocke actuellement les mots de passe dans la base de données, cryptés avec MD5
.
Est-il possible de trier le "décryptage" et de l'envoyer à l'utilisateur par e-mail ou aurais-je besoin d'une page de réinitialisation de mot de passe?
Un mot de passe haché MD5 n'est pas réversible. (MD5 est du hachage et pas vraiment du cryptage, il y a donc une différence subtile). Et oui vous voudrez certainement fournir un processus de "réinitialisation" du mot de passe (et pas simplement envoyer le mot de passe par e-mail).
Pour vous offrir un flux de travail de haut niveau pour la réinitialisation sécurisée des mots de passe ...
Pour vous donner un peu plus de détails sur le hachage ...
Lorsque vous hachez une valeur comme un mot de passe en utilisant la fonction md5 () en PHP, la valeur finale sera la même pour ce mot de passe, quel que soit le serveur sur lequel vous l'exécutez. (Il y a donc une différence que nous pouvons voir immédiatement entre le hachage et le chiffrement ... Il n'y a pas de clé privée/publique impliquée).
C'est donc là que vous verrez les gens mentionner une vulnérabilité à Rainbow tables . Une explication très basique d'une table Rainbow est ... Vous md5 () hachez un tas de mots de dictionnaire (mots de passe faibles) afin d'obtenir leurs valeurs hachées md5 (). Mettez-les dans une table de base de données (table arc-en-ciel).
Maintenant, si vous compromettez la base de données d'un site Web, vous pouvez exécuter les mots de passe hachés des utilisateurs sur votre table Rainbow pour (essentiellement) "inverser" le hachage en un mot de passe. (Vous n'inversez pas vraiment le hachage ... Mais vous avez l'idée).
C'est là que "saler" vos mots de passe est la meilleure pratique. Cela signifie (encore une fois, une idée très basique ici) que vous ajoutez une valeur aléatoire aux mots de passe des utilisateurs avant de le hacher. Désormais, lorsque la table Rainbow est exécutée sur votre base de données, elle n'est pas aussi facilement "inversée" car le hachage md5 () de "mot de passe" est différent de "mot de passe384746".
Voici un joli SO Q/A qui devrait aider. Sécuriser le hachage et le sel pour PHP mots de passe
Selon cet article Le guide définitif de l'authentification de site Web basée sur les formulaires , pour les étapes 3. et 4., je ne suis pas sûr que vous devriez envoyer le même jeton que vous stockez.
Je suppose que vous devez envoyer le jeton, puis le hacher et stocker le jeton haché dans DB. Sinon, si votre base de données est compromise, on peut avoir accès à la page de réinitialisation du mot de passe.
Résumer :
$token = md5(microtime (TRUE)*100000);
$tokenToSendInMail = $token;
$tokenToStoreInDB = hash($token);
où hachage est un algorithme de hachage.
Non, MD5 est irréversible. Le but du hachage des mots de passe est de faire en sorte qu'un attaquant qui accède à votre base de données ne puisse pas accéder aux mots de passe de tout le monde.
Cela dit, MD5 (en particulier MD5 non salé) peut généralement être attaqué en utilisant un Rainbow table . Pour des raisons de sécurité, il vaut mieux utiliser bcrypt .
La meilleure chose à faire pour vous est de demander aux gens de soumettre leur adresse e-mail lors de l'inscription. Ensuite, s'ils oublient, ayez un lien de mot de passe oublié qui réinitialise leur mot de passe avec une valeur aléatoire qui leur est envoyée par courrier électronique afin qu'ils puissent y accéder, puis changer leur mot de passe en quelque chose de plus mémorable. De cette façon, vous n'avez pas besoin de compromettre la sécurité. Vous pourriez avoir un lien dans lequel ils ont juste besoin de soumettre leur nom d'utilisateur, mais pour une meilleure sécurité, vous devriez avoir une question et une réponse ou un mot mémorable.
Vous ne pouvez pas décrypter le mot de passe et vous ne devriez même pas envisager d'envoyer un mot de passe à un utilisateur via du texte en clair. (C'est la façon n ° 1 de ne plus jamais utiliser un site; c'est une faille de sécurité GIGANTIC.) Fournissez une page de réinitialisation de mot de passe déclenchée à partir d'un lien contenant une clé associée à l'heure qui est envoyée à l'e-mail de récupération de mot de passe de l'utilisateur ; c'est l'état de l'art actuel en matière de récupération de mot de passe.
Comme l'a indiqué Marcus Reed, en 2015/2016 si vous avez PHP version> = 5.5 n'utilisez pas MD5, password_hash () et password_verify () fournissent un hachage facile et sécurisé pour votre mot de passe avec le capacité à fournir un coût et à saler automatiquement le hachage.
Je n'ai pas la possibilité de voter ou de commenter actuellement, c'est pourquoi je fais une déclaration définitive pour éviter toute confusion.
MD5 est destiné à être un hachage unidirectionnel. Vous devrez leur faire réinitialiser leur mot de passe.
Utilisez les php intégrés password_verify et password_hash.
Écrivez une page qui accepte le md5 et l'adresse e-mail comme paramètre get et recherche dans la base de données l'e-mail et le mot de passe md5. Suivant les notes de Jared Cobb, cela devrait vous mettre sur la bonne voie. j'ai aussi ajouté quelques exemples
par exemple, l'URL à envoyer http://votredomaine.com/resetpassword.php?code=md5codesentviaemail
$code = isset($_GET['code']) ? $_GET['code'] : '';
$email = isset($_GET['email']) ? $_GET['email'] : '';
$checkPw = '';
if(empty($code) || empty($email))
{
die();
}
$sqlQuery = 'SELECT * FROM users WHERE email = "'.$email.'";
//remember to check for sql injections
//then get the results as an array, i use a database class eg $user
if(!empty($user['password']))
{
$checkPw = md5($user['password']);
}else
{
die();
}
if($checkPw !== $code)
{
die();
}else
{
//display form for user to change password
}
cela devrait être suffisant pour que vous sachiez que l'utilisateur est un utilisateur valide et changez son mot de passe
Non, vous ne pouvez pas le décrypter. c'est toute l'idée.
Vous devez leur envoyer un mot de passe temporaire et le réinitialiser.
Vous devrez créer une page de réinitialisation de mot de passe. Il n'y a aucun moyen dans PHP pour décrypter MD5.
MD5
est une fonction à sens unique. Vous ne pouvez pas le déchiffrer. SO vous devez avoir une page de réinitialisation de mot de passe.