50 votes

A quoi sert md5() ?

Je lisais ce tutoriel pour un système de connexion PHP simple .

En fin de compte, il recommande que vous crypter votre mot de passe en utilisant md5() .

Même si je sais qu'il s'agit d'un tutoriel pour débutants et que vous ne devriez pas mettre des relevés bancaires derrière ce système de connexion, cela m'a fait réfléchir au cryptage.

Je suis donc allé voir (l'une des questions les plus utiles de ce site pour les débutants) : Que doit savoir un développeur avant de créer un site web public ?

Il y est dit (sous la rubrique sécurité) que vous devriez :

Crypter Hachez et salez les mots de passe plutôt plutôt que de les stocker en clair.

Il n'en dit pas beaucoup plus, pas de références.

Alors j'ai pris les devants et j'ai essayé moi-même :

$pass = "Trufa";
$enc = md5($pass);

echo $enc; #will echo 06cb51ce0a9893ec1d2dce07ba5ba710

Et c'est ce qui m'a fait penser que, même si je sais que md5() n'est peut-être pas le moyen le plus puissant de chiffrer, tout ce qui produit toujours le même résultat peut faire l'objet d'une ingénierie inverse.

Quel est donc l'intérêt de crypter quelque chose avec md5() ou toute autre méthode ?

Si un hacker arrive à un mot de passe crypté avec md5(), il n'aurait qu'à utiliser cette page ! .

Alors maintenant, les vraies questions :

  1. Comment fonctionne le cryptage des mots de passe ?

Je sais que je n'ai pas découvert une énorme vulnérabilité du web ici ! :) Je veux juste comprendre la logique derrière le cryptage des mots de passe.

Je suis sûr que je comprends mal quelque chose et j'apprécierais que vous m'aidiez à mettre de l'ordre dans mes idées et dans celles des autres (j'espère).

Comment devriez-vous appliquer le cryptage des mots de passe pour qu'il soit réellement utile ?

  1. Que pensez-vous de cette idée ?

Comme je l'ai dit, il se peut que je comprenne mal l'idée dans son ensemble, mais, cette méthode ajouterait-elle une quelconque sécurité à un environnement réel ?

$reenc = array(
 "h38an",
 "n28nu",
 "fw08d"
 );

$pass = "Trufa";

$enc = chunk_split(md5($pass),5,$reenc[mt_rand(0,count($reenc)-1)]);

echo $enc;

Comme vous le voyez, j'ai ajouté au hasard des chaînes de caractères arbitraires ( $reenc = array() ) à mon mot de passe md5() "pour le rendre unique". Ceci n'est bien sûr qu'un exemple stupide.

Je peux me tromper, mais à moins que vous n'introduisiez le cryptage vous-même, il sera toujours facilement réversible.

Ce qui précède serait mon idée de la "protection par mot de passe" et du mot de passe crypté. Si un pirate y parvient, il ne pourra pas le décrypter à moins d'avoir accès au fichier .php brut.

Je sais que cela n'a peut-être aucun sens, mais je n'arrive pas à comprendre pourquoi c'est une mauvaise idée !


J'espère avoir été suffisamment clair, mais cette question est très longue, veuillez demander toute clarification nécessaire !

Merci d'avance !

20voto

Wroclai Points 15042

Vous devriez avoir un encryption comme md5 ou sha512 . Vous devriez également avoir deux sels différents, un static salt (écrit par vous) et ensuite aussi un unique salt pour ce mot de passe spécifique.

Quelques exemples de code (par exemple, registration.php) :

$unique_salt = hash('md5', microtime()); 
$password = hash('md5', $_POST['password'].'raNdoMStAticSaltHere'.$unique_salt);

Maintenant, vous avez un static salt qui est valable pour tous vos mots de passe, qui sont stockés dans le fichier .php. Ensuite, lors de l'exécution de l'enregistrement, vous générez un unique hash pour ce mot de passe spécifique.

Tout cela aboutit au fait que deux mots de passe qui s'écrivent exactement de la même façon auront deux mots de passe différents. hashes . Le site unique hash est stocké dans le database avec l'identifiant actuel. Si quelqu'un saisit le database ils auront chaque unique salt pour chaque mot de passe spécifique. Mais ce qu'ils n'ont pas, c'est votre static salt qui rendent les choses beaucoup plus difficiles pour tous les "hackers".

C'est ainsi que vous vérifiez la validité de votre mot de passe sur login.php par exemple :

$user = //random username;
$querysalt = mysql_query("SELECT salt FROM password WHERE username='$user'");
while($salt = mysql_fetch_array($querysalt)) {
    $password = hash('md5',
          $_POST['userpassword'].'raNdoMStAticSaltHere'.$salt[salt]);
}

C'est ce que j'ai utilisé dans le passé. C'est très puissant et sûr. Moi-même, je préfère le sha512 le cryptage. C'est en fait juste pour mettre ça dans la fonction de hachage au lieu de md5 dans mon exemple.

Si vous voulez être encore plus sûr, vous pouvez stocker le fichier unique salt dans une base de données complètement différente.

18voto

lijie Points 3544

Tout d'abord, le "hachage" (utilisation d'une fonction cryptographique à sens unique) n'est pas un "cryptage". Dans le cas du cryptage, vous pouvez inverser le processus (décryptage). Dans le cas du hachage, il n'existe (théoriquement) aucun moyen d'inverser le processus.

Un hachage est une fonction f telle que v ne peut être déterminé facilement à partir de f(v).

L'intérêt d'utiliser le hachage pour l'authentification est que vous (ou quelqu'un qui voit la valeur de hachage) n'avez aucun moyen possible (encore une fois, en théorie) de connaître le mot de passe. Cependant, vous pouvez toujours vérifier que l'utilisateur connaît son mot de passe. (En gros, l'utilisateur prouve qu'il connaît v tel que f(v) est le hachage stocké).

La faiblesse d'un simple hachage (en dehors des fonctions de hachage faibles) est que les gens peuvent compiler des tables de mots de passe et leur hachage correspondant et les utiliser pour obtenir (effectivement) l'inverse de la fonction de hachage. Le salage empêche cela car une partie de la valeur d'entrée du hachage est contrôlée et les tables doivent être compilées pour ce sel particulier.

En pratique, vous stockez un sel et une valeur de hachage, et vous vous authentifiez en hachant une combinaison du sel et du mot de passe et en la comparant à votre valeur de hachage.

6voto

darioo Points 23903

MD5 est une fonction de hachage à sens unique qui protège votre mot de passe original de manière plus ou moins sûre.

Donc, disons que votre mot de passe est "Trufa", et sa version hachée est 06cb51ce0a9893ec1d2dce07ba5ba710 .

Par exemple, lorsque vous vous connectez à une nouvelle page web, on vous demande votre nom d'utilisateur et votre mot de passe. Si vous écrivez "Trufa" comme mot de passe, la valeur 06cb51ce0a9893ec1d2dce07ba5ba710 est stockée dans la base de données car elle est hachée.

La prochaine fois que vous vous connecterez, et que vous écrirez "Trufa", la valeur hachée sera comparée à celle de la base de données. Si elles sont identiques, vous êtes authentifié ! À condition que vous ayez saisi le bon nom d'utilisateur, bien sûr.

Si votre mot de passe n'était pas stocké sous sa forme hachée dans la base de données, une personne malveillante pourrait lancer une requête sur cette base de données et voir tous les vrais mots de passe. Et cela serait compromettant.

De plus, comme MD5 est une fonction cryptographique à 128 bits, il existe 2^128-1 = 340282366920938463463374607431768211455 combinaisons possibles.

Comme il y a plus de chaînes possibles que celle-ci, il est possible que deux chaînes génèrent la même valeur de hachage. C'est ce qu'on appelle une collision. Et cela permet de s'assurer qu'un mot de passe haché ne peut pas faire l'objet d'une rétro-ingénierie unique.

5voto

La seule vulnérabilité du salage est que vous devez savoir quel est le sel afin de reconstruire le hachage pour tester le mot de passe. Ceci est contourné en stockant l'entrée dans l'authdb sous la forme suivante <algorithm>$<salt>$<hash> . De cette façon, l'entrée authdb peut être utilisée par tout le code qui y a accès.

4voto

PaulJWilliams Points 11641

Vous manquez l'étape importante : le sel. Il s'agit d'une donnée supplémentaire unique (par utilisateur, dans l'idéal) que vous ajoutez au mot de passe avant de le hacher.

http://en.wikipedia.org/wiki/Salt_%28cryptography%29

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X