Renforcer une signature MD5

ViPHP
ViPHP | 2291 Messages

07 août 2008, 22:55

Le tuto suivant en toute modestie et sans aucune prétention juste pour le plaisir de faire partager.
Je ne prétends pas avoir trouvé une solution miracle, c'est juste une solution parmi d'autre pour rendre la vie plus difficile à certaine andouille qui traîne sur le net
:wink:
Tout le monde pense que MD5 est un algorithme efficace (et moi le premier) et c’est probablement vrai, mais le site http://gdataonline.com a entrepris de stocker les signatures MD5 d’un maximum de mot de passe et pour vous faire peur et surtout vous donner un exemple essayer avec un mot de passe fréquent :
Signature => 21232f297a57a5a743894a0e4a801fc3 et faut moins d’une demi seconde au site pour trouver la correspondance ici admin. (5 lettres).

Puis là il y a quelqu’un qui le dit (oui mais un mot de passe de 5 lettres tu déconne) alors je répondrai ceci
Signature => 372eeffaba2b5b61fb02513ecb84f1ff et faut moins d’une demi seconde au site pour trouver la correspondance ici administrateur. (14 lettres).

Maintenant libre à vous d’imposer des mots de passe 20 caractères mais alors vous risquez d’avoir pas mal de récriminations de la part de vos utilisateurs.
Alors une méthode pour ne pas imposer des mots de passe trop long est de les allonger automatiquement vous-même.

Exemple :
<?php
//Définition de données de connexion//
$host  ="";
$login ="";
$pass  ="";
$base  ="";

        #connexion à MySQL
    $link = mysql_connect($host, $login, $pass)
    or die ("Erreur MySQL :<br />" .$link. "<br />" .
    "Impossible d'établir une connexion avec MySQL");

    mysql_select_db ($base)
    or die ("Erreur MySQL :<br />" .$link. "<br />" .
    "Impossible d\'établir une connexion avec la base ".$base."");


$signature  = 'admin';
$login        = 'dunbar';

function allonge_signature($password) {
	$password = 'prefixe' .$password. 'suffixe';
	return strrev($password);
	}
	 $signature = md5(allonge_signature($password));

	 $requete = 'INSERT
	                 INTO
	              user
	                 SET
	             id       = "",
	             login    = "'.mysql_escape_string($login).'",
	             password = "'.mysql_escape_string($signature).'"';

	            if(false ===($resultat = mysql_query($requete))) {
                die("Erreur MySQL :<br />" .$requete. "<br />" . "Impossible de sauvegarder la/les modification/s");

                }


?>


Cette méthode rajoute un préfixe un suffixe et une chaîne de caractère à la signature.

Signature => 2923d15494c5c5da66f41592ff784aba
Le site ne trouve pas l’équivalent de cette signature.

Par contre le même mot de passe sans suffixe et préfixe la signature est trouver en moins d’une demi seconde.

Pour vérifier le mot de passe il suffit de faire comme ceci.
<?php
//Définition de données de connexion//
$host  ="";
$login ="";
$pass  ="";
$base  ="";

        #connexion à MySQL
    $link = mysql_connect($host, $login, $pass)
    or die ("Erreur MySQL :<br />" .$link. "<br />" .
    "Impossible d'établir une connexion avec MySQL");

    mysql_select_db ($base)
    or die ("Erreur MySQL :<br />" .$link. "<br />" .
    "Impossible d\'établir une connexion avec la base ".$base."");


    $_POST['password'] = 'admin';
    $password          = $_POST['password'];
    $login             = 'dunbar';

   function allonge_signature($password) {
	$password = 'prefixe' .$password. 'suffixe';
	return strrev($password);
	}

	$signature = md5(allonge_signature($password));

          $sql ='SELECT
                     COUNT(*)
                     FROM
                  user
                     WHERE
                  login    = "'.mysql_escape_string($login).'"
                     AND
                  password = "'.mysql_escape_string($signature).'"
                  ';

                 if(false ===($resultat = mysql_query($sql))) {
                die("Erreur MySQL :<br />" .$sql. "<br />" . "Impossible de v&eacute;rifier les donn&eacute;es");

                }

?>

Mammouth du PHP | 1511 Messages

07 août 2008, 23:05

C'est ce que l'on appelle un salt (grain de sel en francais).
C'est très peu utilisé mais redoutablement efficace ;)

ViPHP
ViPHP | 5924 Messages

07 août 2008, 23:08

C'est connu comme technique (et c'est la seule vraiment valable :) ), cela s'appelle utiliser un grain, par ailleurs, même si le dictionnaire trouvait ta chaine, le mot de passe était inutilisable puisque l'algorithme rajoute automatiquement le grain…
Mais c'est tout de même bien de relever la technique :)

shit, grillé :-/

Mammouth du PHP | 1668 Messages

08 août 2008, 09:48

je préfert le sha-1 au md5, même si le résultat est le même, quand on dit qu'une clef n'est pas trouvée c'est faux, une (ou plusieurs) clefs sont trouvées(s) mais elle ne correspondent pas à nos attente :lol:
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

08 août 2008, 11:16

De toutes façon, quel que soit l'algo choisi, la présence du sel est une excellente utilisation.
En plus d'empecher l'attaque par dictionnaire (ce qui est vraisemblablement le cas du site que tu nous donnes dunbar), elle permet de séparer le stockage des données sensibles.
En effet, si, pour une raison ou une autre, tu te fait pomper ta base de données, le sel ne se trouvant pas dans cette base, elle deviendra inutile ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 2291 Messages

08 août 2008, 13:05

(ce qui est vraisemblablement le cas du site que tu nous donnes dunbar),
Absolument