Se cours expose les hashs SHA-512 et YESCRYPT
dans le fichier /etc/shadow , on trouve le hash du mot de passe.
etudiant@ordi:~$ cat /etc/shadow
cat: /etc/shadow: Permission non accordée
etudiant@ordi:~$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1593 juil. 2 13:24 /etc/shadow
etudiant@ordi:~$
on remarque ici que le fichier critique shadow , n’est accessible que par root ! pour des raisons de sécurité ! il contient les mots passes hashés !
Fichier super secret :
/etc/passwd
etudiant@ordi:~$ sudo cat /etc/shadow
[sudo] Mot de passe de etudiant :
root:!:20269:0:99999:7:::
daemon:*:19773:0:99999:7:::
bin:*:19773:0:99999:7:::
sys:*:19773:0:99999:7:::
sync:*:19773:0:99999:7:::
games:*:19773:0:99999:7:::
man:*:19773:0:99999:7:::
lp:*:19773:0:99999:7:::
mail:*:19773:0:99999:7:::
news:*:19773:0:99999:7:::
uucp:*:19773:0:99999:7:::
proxy:*:19773:0:99999:7:::
www-data:*:19773:0:99999:7:::
backup:*:19773:0:99999:7:::
list:*:19773:0:99999:7:::
irc:*:19773:0:99999:7:::
gnats:*:19773:0:99999:7:::
nobody:*:19773:0:99999:7:::
systemd-network:*:19773:0:99999:7:::
systemd-resolve:*:19773:0:99999:7:::
messagebus:*:19773:0:99999:7:::
systemd-timesync:*:19773:0:99999:7:::
syslog:*:19773:0:99999:7:::
_apt:*:19773:0:99999:7:::
tss:*:19773:0:99999:7:::
uuidd:*:19773:0:99999:7:::
systemd-oom:*:19773:0:99999:7:::
tcpdump:*:19773:0:99999:7:::
avahi-autoipd:*:19773:0:99999:7:::
usbmux:*:19773:0:99999:7:::
dnsmasq:*:19773:0:99999:7:::
kernoops:*:19773:0:99999:7:::
avahi:*:19773:0:99999:7:::
cups-pk-helper:*:19773:0:99999:7:::
rtkit:*:19773:0:99999:7:::
whoopsie:*:19773:0:99999:7:::
sssd:*:19773:0:99999:7:::
speech-dispatcher:!:19773:0:99999:7:::
fwupd-refresh:*:19773:0:99999:7:::
nm-openvpn:*:19773:0:99999:7:::
saned:*:19773:0:99999:7:::
colord:*:19773:0:99999:7:::
geoclue:*:19773:0:99999:7:::
pulse:*:19773:0:99999:7:::
gnome-initial-setup:*:19773:0:99999:7:::
hplip:*:19773:0:99999:7:::
gdm:*:19773:0:99999:7:::
etudiant:$y$j9T$Pujdg7OJEBcONKuWJPl48.$rOHojUWdxPBka.S7GYinR68n82.t5Y/NQ2kiQX4CJv0:20269:0:99999:7:::
dorian:$y$j9T$zr4ZdrviuR/b8uWBTDxDP1$ZwjOhxOGM7PgLF4FJoNivmW/P3/XwLGzhNe0eZCAvZ9:20271:0:99999:7:::
sshd:*:20271:0:99999:7:::
etudiant@ordi:~$
on voit le mot de passe etudiant hashé en jaune le salage en bleu !
$y$j9T$Pujdg7OJEBcONKuWJPl48.$rOHojUWdxPBka.S7GYinR68n82.t5Y/NQ2kiQX4CJv0
Le hash est au format moderne yescrypt (identifiable grâce au préfixe $y$)
Pourquoi on hash le mot de passe !
Même root ne peut pas savoir ce que vous avez mis comme mot de passe et c’est le grand intérêt du hash ! Et si on se fait voler le fichier shadow les mots de passes des utilisateurs ne sont pas compromis.
D’ailleurs si vous devez faire un applicatif qui utilise des mots de passes , il faut impérativement utiliser les hashs pour sécuriser votre travail.
openssl
installation de openssl sous debian et dérivés
sudo apt update && sudo apt install openssl # si ça n'est pas déjà fait
comment ca fonctionne
le mieux est de faire une petite démo ! on va utiliser du SHA-512
etudiant@ordi:~$ openssl passwd -6 'etudiant'
$6$Q0mhKcxPG4EHxACp$NIKIQoJdxaO0ZR4OQ7FOfruPRO/AQygtNPG2v47cxHaj2AsAFTzUFH87dqY1QsSLxHB4XRuhQNNhpa.CoeE06/
etudiant@ordi:~$ openssl passwd -6 'etudiant'
$6$FrzsNkc9D5OJrlek$4HvDLsMYlozd6K5Dg81GklUwXLhuI6chMZW8NyFjhoXwxRQR/e8qxd959.cA0f6yKH.ZICs/ElTZ4KhZdvtJF1
etudiant@ordi:~$ openssl passwd -6 'etudiant'
$6$OCFT0wGhueYVgKYp$iRZMKgHiD6iRy33aRrQ7mqe1qfw04vg0eaEz5MUE7q.tFnnknZPKr1VOK8N42oUvnk.WmM0na50.ygfbcp0pn.
etudiant@ordi:~$
nous avons 3 hashs différents du mot de passe etudiant ! et on peut continuer comme ça !!!
Et pourtant dedans il y a bien etudiant à chaque fois !
Lors de la génération du hash , un sel (salt) est proposé de façon aléatoire, c’est l’explication des différents hash possible du même mot de passe.
🧬 Pourquoi openssl passwd est utilisé alors ?
Parce qu’il permet de générer des hachages de mots de passe compatibles avec /etc/shadow.
-1pour MD5-5pour SHA-256-6pour SHA-512 (le plus courant et recommandé)
Comment connaitre les grains de sel !
$6$Q0mhKcxPG4EHxACp$NIKIQoJdxaO0ZR4OQ7FOfruPRO/AQygtNPG2v47cxHaj2AsAFTzUFH87dqY1QsSLxHB4XRuhQNNhpa.CoeE06/
$<id>$<salt>$<hash>
Donc maintenant avec openssl on peut vérifier , le mot de passe avec le bon salage
etudiant@ordi:~/Works/crypt$ openssl passwd -6 -salt Q0mhKcxPG4EHxACp etudiant
$6$Q0mhKcxPG4EHxACp$NIKIQoJdxaO0ZR4OQ7FOfruPRO/AQygtNPG2v47cxHaj2AsAFTzUFH87dqY1QsSLxHB4XRuhQNNhpa.CoeE06/
etudiant@ordi:~/Works/crypt$
on voit bien qu’on obtient le même hash avec le même salage ! c’est une bonne recette !
Sous nos debians , possible d’utiliser un hash SHA-512 sans problème, dans le fichier /etc/shadow
mkpasswd
sudo apt update && sudo apt install whois
générer des hashs
etudiant@AnduinOS:~/Works/crypt$ mkpasswd --method=yescrypt 'etudiant'
$y$j9T$.AkHetG0xNgKo4eDdzO45/$5IT.Qr9zXhCapzF75v9b84VdmmJ1JOK5FldDT2PcFu6
etudiant@AnduinOS:~/Works/crypt$ mkpasswd --method=yescrypt "etudiant"
$y$j9T$aGUqz.JEQP1W4UX7ANyKb1$TnCcmnESAFbPvoAcSgV1pxuC5LmhrMHi5MiZfZeJVu2
etudiant@AnduinOS:~/Works/crypt$ mkpasswd --method=sha-512 "etudiant"
$6$MTnpxkNGS72.kKO6$ldUJm7YSP6kc2O31ldc9dXo6H8xAo/CKoMj0MaINKcH/JuXXguVLYkWmB8IausLdOQmfPs.SApKBk3nTkgvDs1
🔍 Comparaison : yescrypt vs SHA-512 crypt
| Critère | yescrypt | SHA-512 crypt ($6$) |
|---|---|---|
| Sécurité | Très élevée | Élevée |
| Résistance GPU/ASIC | Très bonne (résistant aux attaques parallélisées) | Moins bonne (plus vulnérable au brute force GPU) |
| Consommation mémoire | Plus élevée (paramétrable) | Faible |
| Vitesse (temps hash) | Plus lente (délibéré pour sécurité) | Plus rapide (moins costaud) |
| Adoption | Récente, supportée sur Debian 12+, libxcrypt | Standard historique, universel |
| Paramétrage | Flexible (rounds, mémoire) | Round count configurable |
Comparer un mot de passe et son hash en C
testmdp.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <crypt.h>
int main()
{
const char *password = "etudiant"; // Mot de passe à tester
const char *hash = "$y$j9T$Pujdg7OJEBcONKuWJPl48.$rOHojUWdxPBka.S7GYinR68n82.t5Y/NQ2kiQX4CJv0";
char *result = crypt(password, hash);
if (result == NULL) {
perror("crypt");
return 1;
}
if (strcmp(result, hash) == 0) {
printf("✅ Mot de passe correct !\n");
} else {
printf("❌ Mot de passe incorrect.\n");
}
return EXIT_SUCCESS;
}
etudiant@ordi:~/Works/crypt$ gcc testmdp.c -o testmdp -lcrypt
etudiant@ordi:~/Works/crypt$ ./testmdp
✅ Mot de passe correct !
etudiant@ordi:~/Works/crypt$
une fonction crypt existe en c
