Donc avec ce code on entre sont identifiant et on entre son adresse e-mail le seul bémole c'est que mes mot de passe son cryptée en md5 pas le choix pour la connexion d'un jeux et donc j'aimerais savoir quelle et la valeur approprié pour recevoir le mot de passe décrypter sur l'email !.

<?php
if(isset($_POST) && isset($_POST'identifiant']) && isset($_POST'email'])){
    extract($_POST);
    if(!empty($identifiant) && !empty($email)){

function random($car) {
$string = "";
$chaine = "abcdefghijklmnpqrstuvwxy";
srand((double)microtime()*1000000);
for($i=0; $i<$car; $i++) {
$string .= $chaine[rand()%strlen($chaine)];
}
return $string;
}

        $new_pass = random(20);
        $query=$cnx->prepare('UPDATE me_utilisateur SET passe = :new_pass WHERE email = :email');
        $query->bindValue(':new_pass', $new_pass, PDO::PARAM_STR);
        $query->bindValue(':email', $email, PDO::PARAM_STR);

        if($query->execute()) {
            $donnees = $query->fetch();
            $passe = $donnees'passe'];
            $destinataire="$email";
            $msg="Récupération de votre mot de passe";
            $entete="Bonjour $identifiant, votre mot de passe est: $passe";
            mail($destinataire, $msg, $entete);

            header("Location: ../index.php");
        }
        else
            echo "Une erreur est survenue, veuillez réeffectuer l'opération";
    }
    else
        echo "Vous n'avez pas rempli tout les champs";
}
?>

J'ai déjà essayer sa : (Sans succès)

define('HEX_CHARS', '0123456789abcdef');
define('BASE62_CHARS', '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');

/ ********************************************* /
function ConvertFromArbitraryBase($Str, $Chars)
/ ********************************************* /
{
    /*
        Converts from an arbitrary-base string to a decimal string
    */

    if (ereg('^' . $Chars . ']+$', $Str))
    {
        $Result = '0';

        for ($i=0; $i<strlen($Str); $i++)
        {
            if ($i != 0) $Result = bcmul($Result, strlen($Chars));
            $Result = bcadd($Result, strpos($Chars, $Str$i]));
        }

        return $Result;
    }

    return false;
}

/ ******************************************* /
function ConvertToArbitraryBase($Str, $Chars)
/ ******************************************* /
{
    /*
        Converts from a decimal string to an arbitrary-base string
    */

    if (ereg('^[0-9]+$', $Str))
    {
        $Result = '';

        do
        {
            $Result .= $Chars[bcmod($Str, strlen($Chars))];
            $Str = bcdiv($Str, strlen($Chars));
        }
        while (bccomp($Str, '0') != 0);

        return strrev($Result);
    }

    return false;
}

/ ********************** /
function CustomMD5($Str)
/ ********************** /
{
    return ConvertToArbitraryBase(ConvertFromArbitraryBase(md5($Str), HEX_CHARS), BASE62_CHARS);
}

6 réponses


antho07
Réponse acceptée

Bonjour ,
je repète:

Il n'existe pas de fonction permettant de retrouver à partir d'un hash le message en clair

ça ne pose aucun problème de fonctionnement:

<u>Création de compte</u>:

L'utilisateur choisit un mot de passe mdp:

Tu stockes en base le hash que j'appele mdp_hash

<u>Connexion :</u>

L'utilisateur rentre son mot de passe pwd. Pour vérifier si le mot de passe est correct, tu compares le hash md5 du mot de passe entrée avec celui stocké en base.

<u>Changement de mot de passe :</u>

L'utilisateur clique sur "mot de passe oublié" ,

Au choix, tu généres un mot de passe aleatoire, tu lui envois par mail en clair , tu stockes le hash en base comme nouveau mot de passe.
Il se connecte avec celui-là, il peut effectuer le changement de mot de passe.

ou alors tu généres un tocken de securité, tu lui envois un lien par mail avec ce token , valable une seule fois. La page sur laquelle pointe le lien le connecte directement et lui permet de définir un nouveau mot de passe.

Quand tu dis "pourtant j'ai pas le choix", tu attends quoi ? On va pas te donner quelque chose qui n'existe pas et qui est IMPOSSIBLE.

Pourquoi impossible:

Le hash est de longueur fixe , toujours la même. L'ensemble de tous les hash possibles est donc fini . Il en existe un nombre fini, certes très éleves mais fini !

En revanche , le nombre de mot de passe possible est lui infini (bon là on pourrait dire "non on va pas y mettre 200 000 caracteres, mais le hash peut servir aussi à calculer l emprunte d'un fichier de taille quelconque donc par exemple un fichier de 200go si on veut)

En résumé, il y a beaucoup plus d'entrée possible à la fonction de hashage que de sortie.

Donc le hash agit sur n'importe quel message d'entrée (en faite sur n'importe quel série de bits) et fournit en sortie un message de taille fixe.

Hash : A (taille quelconque) ---> B(taille fixe)

La taille de A est donc bien plus grande que B .

ça veut dire deux choses:

1) On perd de l'information

2) On aura plusieurs messages qui donnent le même hash (principe des tiroirs, on a je sais pas 200 000 choses à ranger dans 200 tiroirs... forcement y'en a qui vont se retrouver dans le même tiroir)
Comment alors retrouver le message d entrée grâce à la sortie alors que y'en a plusieurs??
C'est impossible...

Et là, je sens la question "Mais alors c'est pas sécurisé, plusieurs message donnent le meme hash" .
Oui c'est vrai plusieurs messages donnent effectivement le même hash. Sauf que les fonctions de hashage sont résistantes aux collisions (et à la seconde préimage ça c plus technique j'en parle pas) , ça veut dire quoi "résistante aux collisions":

ça veut dire qu'il est quasi impossible de construire deux messages a et b qui donneront le même hash.

En conclusion: Le hash est à sens unique.. une fois appliquée on ne peut pas revenir en arrière.

Cordialement

Antho

Bonjour,
il n'y a aucun moyen de récupérer le mot de passe en clair à partir du hash.
Tu l'as de manière décrypter quand tu le généres:

$new_pass = random(20)

Pour l'identification tu compares ensuite le hash du mot de passe entrée par l'utilisateur avec celui stocké en base.

cordialement

Antho

PS: Pour plus de précisions, un hash est une fonction à sens unique.
Le MD5 par exemple fournira en sortie toujours la meme taille de chaine, que tu haches 3 caracteres, 20 caracteres, un fichier d'1go , toujours la meme longueur en sortie.

Pour aller plus loin, les autres propriétés des fonctions de hashages sont plus techniques (résistance à la seconde préimage, résistante aux collisions)

Et bien pourtant je n'est pas le choix car si j'enguage par exemple tu entre ton identifiant et tu change le mot de passe sa ne va pas fonctionner risque de hacking de compte. Après à voir le système de clé Token mai je ne veut pas faire compliquer !.

Comme le dit antho, il faut envoyer le mot de passe clair, pas celui que tu crypte pour aller dans la base.

Je comprends pas trop en quoi ça peut poser un problème de sécurité sachant que le mot est envoyé par mail. Il faudrait que le "hacker" se connecte sur l'adresse mail de la personne pour récupérer le mot de passe en clair.

Cette demande de poste et fait pour m'aider dans ce code car car l'utilisateur reçois l'email il ne reçois pas le mot de passe et sur ce code il y a donc un beug pour que sa le décrypte en clair j'aimerais que vous m'aidiez car je n'y comprend pas grand chose pour le décryptage et que sa l'affiche dans l'email

Merci je vais essayer de trouver un autre système :) c'est trop compliquer :)