web-dev-qa-db-fra.com

PHP Fonction de mot de passe oublié

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?

36
Liam

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 ...

  1. Lorsque l'utilisateur demande de réinitialiser son mot de passe, faites-lui entrer son adresse e-mail
  2. N'indiquez pas si cette adresse e-mail était valide ou non (dites-leur simplement qu'un e-mail a été envoyé). Ceci est ouvert au débat car il réduit la convivialité (c'est-à-dire que je ne sais pas avec quel courrier électronique je me suis inscrit) mais il offre moins d'informations aux personnes qui tentent de collecter des informations sur les courriers électroniques qui sont réellement enregistrés sur votre site.
  3. Générez un jeton (peut-être hachez un horodatage avec un sel) et stockez-le dans la base de données dans l'enregistrement de l'utilisateur.
  4. Envoyez un e-mail à l'utilisateur avec un lien vers la page de réinitialisation de votre http s (jeton et adresse e-mail dans l'url).
  5. Utilisez le jeton et l'adresse e-mail pour valider l'utilisateur.
  6. Laissez-les choisir un nouveau mot de passe, remplaçant l'ancien.
  7. De plus, c'est une bonne idée de faire expirer ces jetons après un certain délai, généralement 24 heures.
  8. Eventuellement, enregistrez le nombre de tentatives "oubliées" et peut-être implémentez des fonctionnalités plus complexes si les gens demandent une tonne d'e-mails.
  9. En option, enregistrez (dans un tableau séparé) l'adresse IP de la personne demandant la réinitialisation. Incrémentez un nombre à partir de cette adresse IP. S'il atteint jamais plus de, disons, 10 ... Ignorez leurs futures demandes.

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

134
Jared Cobb

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.

9
Mansur Khan

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 .

7
ceejayoz

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.

3
tom

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.

3
Paul Sonier

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.

3
Chris

MD5 est destiné à être un hachage unidirectionnel. Vous devrez leur faire réinitialiser leur mot de passe.

2

Utilisez les php intégrés password_verify et password_hash.

2
Marcus Reed

É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

2
Ryan

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.

1
Neal

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.

1
Michael Irigoyen

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.

1
Balanivash