Bcrypt vs Argon2 : quel hash de mot de passe en 2026
Bcrypt et Argon2 sont les deux fonctions de hachage de mots de passe les plus utilisées aujourd'hui. Toutes deux sont conçues pour être lentes et résistantes aux attaques par force brute, contrairement à MD5 ou SHA-256 qui sont rapides par construction. Argon2 a remporté la Password Hashing Competition en 2015 et est désormais le choix recommandé par l'OWASP pour les nouvelles applications. Bcrypt reste un excellent choix mature et largement supporté. Cet article explique précisément les différences pour vous aider à trancher.
Pourquoi un hash de mot de passe est différent
Un hash cryptographique classique comme SHA-256 est conçu pour être rapide : on veut hasher des Go de données par seconde. Pour les mots de passe, cette propriété est un défaut : un attaquant qui récupère votre table d'utilisateurs peut tester des milliards de mots de passe par seconde sur un GPU. Une fonction de hachage de mot de passe (PHF, password hashing function) cherche au contraire à être :
- Lente par construction, avec un paramètre de coût ajustable
- Salée, pour empêcher les rainbow tables et les attaques parallèles sur plusieurs comptes
- Résistante au matériel spécialisé (GPU, FPGA, ASIC) pour limiter le speedup adversarial
Le sel et le paramètre de coût sont stockés avec le hash, dans une chaîne unique typiquement
de la forme $algo$params$sel$hash. Cela permet d'augmenter le coût avec le temps sans
forcer la migration immédiate des anciens hashs.
Bcrypt : 1999, Blowfish, paramètre cost
Bcrypt a été conçu par Niels Provos et David Mazières pour OpenBSD en 1999. Il est
basé sur l'algorithme de chiffrement Blowfish, dont il exploite le coût élevé d'initialisation des
tables. Bcrypt expose un seul paramètre, cost (ou rounds), qui définit le
nombre d'itérations sous la forme 2^cost. Augmenter cost de 1 double le temps de calcul.
Format de sortie typique :
$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
| | | |
| | cost = 12 sel + hash en base64
| variante (2y = openbsd)
algo bcrypt
Bcrypt limite l'entrée à 72 octets : un mot de passe plus long est tronqué silencieusement, ce qui est un piège connu. La parade habituelle est de pré-hasher avec SHA-256 puis encoder en base64 avant bcrypt, mais cela peut introduire des null bytes problématiques sur certaines implémentations. Argon2 n'a pas cette limite.
Argon2 : 2015, vainqueur PHC, 3 variantes
Argon2 a été conçu par Alex Biryukov, Daniel Dinu et Dmitry Khovratovich. Il a remporté la Password Hashing Competition en juillet 2015 et est standardisé par RFC 9106 (2021). Argon2 expose trois paramètres :
- Memory cost (
m) : quantité de mémoire utilisée, en KiB - Time cost (
t) : nombre d'itérations sur le bloc mémoire - Parallelism (
p) : nombre de threads parallèles
Argon2 existe en trois variantes :
- Argon2d : accès mémoire dépendant des données. Plus résistant aux attaques GPU, mais sensible aux attaques par canal auxiliaire (timing, cache).
- Argon2i : accès mémoire indépendant des données. Résistant aux side-channels, légèrement moins résistant aux attaques GPU.
- Argon2id : hybride, démarre en mode i puis bascule en mode d. Recommandé par défaut par RFC 9106 et OWASP.
Les paramètres recommandés par OWASP en 2026 pour Argon2id : m=19456 KiB (19 MiB),
t=2, p=1. Format de sortie typique :
$argon2id$v=19$m=19456,t=2,p=1$c2VsX2FsZWF0b2lyZQ$aGFzaF9jYWxjdWxl
| | | | |
| | parametres sel base64 hash base64
| version
algo argon2id
Pourquoi Argon2id est recommandé
La résistance au matériel spécialisé est aujourd'hui le critère décisif. Bcrypt utilise peu de mémoire (~4 KiB), ce qui permet à un GPU haut de gamme de tester des centaines de milliers de hashs par seconde. Argon2id est memory-hard : forcer plusieurs MiB de mémoire par tentative réduit drastiquement le parallélisme atteignable sur GPU et rend la conception d'ASIC dédiés économiquement non rentable.
Le mode hybride d'Argon2id offre en plus une protection contre les attaques par canal auxiliaire pendant la première moitié du calcul. C'est cette combinaison qui justifie sa place de recommandation par défaut de l'OWASP, du NIST SP 800-63B (depuis la révision 2024) et de la RFC 9106.
Tableau comparatif
| Critère | Bcrypt | Argon2id |
|---|---|---|
| Année | 1999 | 2015 |
| Standardisation | De facto, USENIX 1999 | RFC 9106 (2021) |
| Paramètres | cost | memory, time, parallelism |
| Mémoire utilisée | ~4 KiB | Configurable (~19 MiB recommandé) |
| Memory-hard | Non | Oui |
| Résistance GPU | Modérée | Forte |
| Résistance side-channel | Bonne (constant-time) | Bonne (mode id) |
| Limite d'entrée | 72 octets | Aucune |
| Recommandation OWASP 2026 | Acceptable | Préféré |
| Maturité écosystème | Très large | Large depuis ~2018 |
Performance et résistance aux attaques
Sur un serveur moderne, un bcrypt à cost=12 prend environ 250 ms et un argon2id avec les paramètres OWASP environ 100-300 ms selon la machine. Le temps absolu n'est pas le critère : ce qui compte est le rapport entre votre coût (un calcul, une fois par login) et celui de l'attaquant (des milliards de calculs sur GPU pour casser un dump).
Sur une RTX 4090, hashcat atteint environ 200 000 bcrypt/s à cost=12, contre quelques dizaines de milliers d'argon2id à 19 MiB. Pour le même temps de calcul côté serveur, Argon2id ralentit l'attaquant 5 à 10 fois plus que bcrypt, et l'écart se creuse avec les nouvelles générations de GPU.
Exemples PHP
PHP supporte les deux nativement via password_hash() et password_verify()
depuis PHP 7.2 pour Argon2i (et 7.3 pour Argon2id). Le constructeur PHP gère sel et format
automatiquement.
Bcrypt
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
$ok = password_verify($password, $hash);
if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) {
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
}
Argon2id
$opts = [
'memory_cost' => 19456, // 19 MiB
'time_cost' => 2,
'threads' => 1,
];
$hash = password_hash($password, PASSWORD_ARGON2ID, $opts);
$ok = password_verify($password, $hash);
if (password_needs_rehash($hash, PASSWORD_ARGON2ID, $opts)) {
$hash = password_hash($password, PASSWORD_ARGON2ID, $opts);
}
Vous pouvez générer ou identifier des hashs de tous types avec notre générateur de hash et notre identifieur de hash.
Recommandation
Pour une nouvelle application en 2026, choisissez Argon2id avec les paramètres
OWASP comme baseline (m=19456, t=2, p=1), à ajuster selon le
temps cible (typiquement 250 à 500 ms). Si vous maintenez une application existante en bcrypt, il
n'y a pas d'urgence à migrer : bcrypt à cost=12 ou plus reste sûr en 2026. Profitez d'un
password_needs_rehash() au prochain login pour migrer progressivement les utilisateurs
actifs vers Argon2id.
Évitez absolument MD5, SHA-1 et SHA-256 nu pour les mots de passe (voir notre comparatif MD5 vs SHA-256). Aucun de ces algorithmes n'est conçu pour cet usage.
Questions fréquentes
Bcrypt est-il encore sûr en 2026 ?
Oui, à condition d'utiliser un cost suffisant (12 minimum, 14 si possible). Bcrypt n'a pas de faille cryptographique connue. Sa seule faiblesse relative à Argon2id est sa faible empreinte mémoire, qui le rend plus accessible aux attaques GPU et FPGA.
Faut-il migrer une base bcrypt vers Argon2id ?
Pas en urgence. Une migration progressive avec password_needs_rehash() est l'approche
recommandée : à chaque login réussi, vous re-hashez le mot de passe en Argon2id. Au bout de
quelques mois, la majorité des utilisateurs actifs sont migrés, et vous pouvez forcer une
réinitialisation pour les comptes dormants.
Quel est le bon nombre de threads pour Argon2id ?
OWASP recommande p=1 par défaut. Augmenter p n'apporte rien si votre
serveur web traite déjà beaucoup de requêtes en parallèle, et complique le tuning. Privilégiez
plutôt l'augmentation de m (mémoire) qui est le principal levier de résistance GPU.
Qu'est-ce qu'un « bcrypt decrypter » ?
Il n'existe pas de décrypteur bcrypt : la fonction est à sens unique par construction. Les outils qui prétendent « décrypter » bcrypt ne font que tester des dictionnaires de mots de passe courants contre le hash. C'est exactement la même chose qu'un attaquant qui aurait votre table.
Argon2i ou Argon2id ?
Argon2id dans tous les cas pour les mots de passe. Argon2i est légèrement plus sûr face aux side-channels mais plus faible face aux attaques GPU. Argon2id combine les avantages des deux et est explicitement recommandé par RFC 9106 pour le hachage de mots de passe.
Faut-il poivrer (pepper) en plus du sel ?
Le sel suffit pour la grande majorité des applications. Un poivre (clé secrète stockée hors base de données et utilisée comme HMAC avant le hash) ajoute une couche en cas de fuite de la base sans compromission du serveur applicatif. Argon2id ne le fournit pas nativement, il faut le composer manuellement.