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.