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.

  • -1 pour MD5
  • -5 pour SHA-256
  • -6 pour 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èreyescryptSHA-512 crypt ($6$)
SécuritéTrès élevéeÉlevée
Résistance GPU/ASICTrès bonne (résistant aux attaques parallélisées)Moins bonne (plus vulnérable au brute force GPU)
Consommation mémoirePlus élevée (paramétrable)Faible
Vitesse (temps hash)Plus lente (délibéré pour sécurité)Plus rapide (moins costaud)
AdoptionRécente, supportée sur Debian 12+, libxcryptStandard historique, universel
ParamétrageFlexible (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