Hachage (irréversible)

AlgorithmeRésultat
MD5cf0051f7204be0ec68e12a1b4f822666
SHA-178d0d3068e3660ac5e8fbd7dd9f7a439a054c4e3
SHA-256c79a5fac52c8a63a94f4a7e401f5fb3a8dd6e9abead9634876507c0479dc7b7d
bcrypt$2y$12$M9Y6TWxs0wruvGN90SWcF..17YWmO.HOZhEUFdOlU6N.N8od6d8kK
Argon2id$argon2id$v=19$m=65536,t=4,p=1$VGpaYkRNL1NVRUxwbGE3Nw$skU3FfZlf1NckSmwdNGhM+63RLoG/rkx+sqosBoVZ5M

Chaque algorithme produit une empreinte de taille fixe à partir de laquelle on ne peut jamais retrouver l'entrée d'origine : on ne peut que recalculer l'empreinte d'une valeur candidate et la comparer (password_verify()).

Chiffrement (réversible avec la clé)

Clé secrète (générée pour cette démo)
9cLSLNZm+CxcdDjZrnxJ/EKvVHbK5pULp7crAUPeV0Q=
Texte chiffré (XChaCha20-Poly1305)
FD8IeTABHBA3qPXIPxcxjVA9YJTKjCWkfGt7t3Dk
Déchiffré avec la clé
MotDePasse123!

Avec la clé, le texte original est intégralement récupéré : le chiffrement est réversible. C'est la bonne méthode pour des données qu'on doit pouvoir relire (carte bancaire, document...), mais jamais pour des mots de passe.

"Craquer" un hash faible : attaque par dictionnaire

On construit une petite "table arc-en-ciel" en hachant en MD5 quelques mots de passe courants. On compare ensuite cette table à la colonne password_legacy (MD5, héritée d'un ancien système) et à la colonne password_hash (Argon2id) de chaque utilisateur :


Deprecated: Using null as an array offset is deprecated, use an empty string instead in /var/www/html/OWASP/A03-Sensitive-Data-Exposure/demo_hash_vs_crypto.php on line 90
Utilisateurpassword_legacy (MD5)Mot de passe retrouvé ?password_hash (Argon2id)
admin 57c0dfd7aa8690e2b07efd6ebf2fd6ae "Admin#2026!" $argon2id$v=19$m=65536,t=4,p=1...
alice 482c811da5d5b4bc6d497ffa98491e38 "password123" $argon2id$v=19$m=65536,t=4,p=1...
bob 482c811da5d5b4bc6d497ffa98491e38 "password123" $argon2id$v=19$m=65536,t=4,p=1...
charlie
Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/html/OWASP/A03-Sensitive-Data-Exposure/demo_hash_vs_crypto.php on line 93
non trouvée dans le dictionnaire $argon2id$v=19$m=65536,t=4,p=1...

La colonne password_legacy (MD5, sans sel) est cassée en quelques microsecondes dès que le mot de passe figure dans un dictionnaire connu - c'est exactement le mécanisme exploité dans le TP A02 (authentification vulnérable). La colonne password_hash (Argon2id, salée et coûteuse en calcul) ne peut pas être attaquée de cette façon : il n'existe pas de table précalculée possible, et chaque essai de mot de passe nécessite un recalcul coûteux.