Aller au contenu
← Back to blog

Argon2id vs bcrypt vs scrypt : Lequel Choisir ?

argon2idbcryptscryptcryptographiesecuritederivation-de-cleowasphachage-mots-de-passe

Si vous construisez quoi que ce soit qui stocke des mots de passe utilisateurs, vous devez choisir une fonction de hachage de mots de passe. Les trois options réalistes en 2026 sont Argon2id, bcrypt et scrypt. Chacune a des propriétés de sécurité, des caractéristiques de performance et des modèles de menace différents.

Ce guide les compare directement, avec benchmarks, recommandations OWASP et exemples de code à copier-coller en Node.js, Python et Rust.

Qu'est-ce qu'une Fonction de Hachage de Mots de Passe ?

Une fonction de hachage de mots de passe est une fonction cryptographique lente, salée et à sens unique, conçue spécifiquement pour les mots de passe. Elle est :

  • Lente exprès (des millions à des milliards de fois plus lente que SHA-256) pour rendre la force brute coûteuse
  • Salée pour prévenir les attaques par tables arc-en-ciel
  • À sens unique pour que le mot de passe original ne puisse pas être retrouvé

Les fonctions de hachage à usage général (MD5, SHA-256) ne conviennent pas aux mots de passe — elles sont conçues pour être rapides, ce qui est l'opposé de ce que vous voulez.

Les Trois Candidats

bcrypt (1999)

Conçu par Niels Provos et David Mazières. Basé sur le chiffrement Blowfish. Difficile sur CPU par conception (calendrier de clés itératif).

// Node.js
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);  // facteur de coût 12
const ok = await bcrypt.compare(password, hash);
# Python
import bcrypt
hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt(rounds=12))
ok = bcrypt.checkpw(password.encode(), hash)
// Rust
use bcrypt::{hash, verify, DEFAULT_COST};
let hash = hash(password, DEFAULT_COST)?;
let ok = verify(password, &hash)?;

scrypt (2009)

Conçu par Colin Percival. À mémoire dure — utilise une quantité configurable de RAM pour rendre les attaques GPU/ASIC coûteuses. Propulse Tarsnap et de nombreux wallets crypto.

// Node.js (intégré)
const crypto = require('crypto');
const salt = crypto.randomBytes(16);
const hash = crypto.scryptSync(password, salt, 64, { N: 16384, r: 8, p: 1 });
# Python
import hashlib
salt = os.urandom(16)
hash = hashlib.scrypt(password.encode(), salt=salt, n=16384, r=8, p=1, dklen=64)

Argon2id (2015)

Vainqueur du Password Hashing Competition. Trois variantes : Argon2d (dépendant des données, le plus rapide), Argon2i (indépendant des données, résistant aux canaux auxiliaires), et Argon2id (hybride — la variante recommandée).

// Node.js
const argon2 = require('argon2');
const hash = await argon2.hash(password, {
  type: argon2.argon2id,
  memoryCost: 65536,   // 64 Mio
  timeCost: 3,
  parallelism: 4,
});
const ok = await argon2.verify(hash, password);
# Python
from argon2 import PasswordHasher
ph = PasswordHasher(time_cost=3, memory_cost=65536, parallelism=4)
hash = ph.hash(password)
ok = ph.verify(hash, password)
// Rust
use argon2::{Argon2, PasswordHasher, password_hash::{SaltString, rand_core::OsRng}};

let salt = SaltString::generate(&mut OsRng);
let argon2 = Argon2::default();
let hash = argon2.hash_password(password.as_bytes(), &salt)?.to_string();

Comparaison Technique

PropriétébcryptscryptArgon2id
Année199920092015
Mémoire dureNonOuiOui
Parallélisme réglableNonOui (blockmix p)Oui (param p)
Itérations réglablesOui (cost)Oui (N)Oui (param t)
Résistant aux canaux auxiliairesPartielOui (configurable)Oui (mode Argon2i)
Longueur max du mot de passe72 octets (puis tronqué silencieusement)IllimitéeIllimitée
Standardiséde factoRFC 7914RFC 9106
Recommandé OWASP (2026)Repli acceptableAcceptablePréféré
Coût d'attaque GPUFaible (peu coûteux à attaquer)ÉlevéÉlevé
Coût d'attaque ASICFaibleMoyen-ÉlevéÉlevé

Benchmarks de Performance (2026, un cœur, x86 moderne)

AlgorithmeMémoireTempsHash/s sur RTX 4090
bcrypt (cost 12)4 Ko~250 ms~4 000
scrypt (N=2^15, r=8, p=1)32 Mo~200 ms~50
Argon2id (64 Mo, t=3, p=4)256 Mo~300 ms~5
Argon2id (19 Mo, t=2, p=1)19 Mo~50 ms~200
SHA-256 (pour comparaison)0< 1 µs10 milliards+

L'insight clé : Argon2id est 3 ordres de grandeur plus difficile à attaquer sur GPU que bcrypt, grâce à sa dureté mémoire.

Modèles de Menace

Pourquoi bcrypt n'est plus le meilleur choix

La troncature à 72 octets de bcrypt est un vrai problème. Si votre utilisateur choisit une phrase de passe comme "correct horse battery staple", bcrypt ne hache que les 72 premiers octets (environ 60 caractères). Le reste est ignoré. Combinée au minuscule empreinte mémoire de bcrypt (4 Ko), une pile de GPU permet de casser des hashes bcrypt à des milliers de tentatives par seconde par GPU.

Pourquoi scrypt est bien mais rarement utilisé

scrypt était la première KDF à mémoire dure pratique et est excellent en théorie. Mais :

  • Le paramètre N est le nombre d'itérations, mais les paramètres r (taille de bloc) et p (parallélisme) sont moins intuitifs
  • Peu de bibliothèques de qualité production ont une implémentation stable et auditée
  • Il est plus difficile à configurer en toute sécurité qu'Argon2id

Pourquoi Argon2id gagne

  1. Recommandé par l'OWASP depuis 2017
  2. Trois paramètres orthogonaux (mémoire, temps, parallélisme) réglables indépendamment
  3. Mode hybride (id) combine la résistance GPU d'Argon2d avec la résistance aux canaux auxiliaires d'Argon2i
  4. Standardisé en RFC 9106
  5. À mémoire dure par construction, pas comme option de configuration

Fiche OWASP sur le Stockage des Mots de Passe (2026)

RéglageMémoire (Kio)ItérationsParallélismeCas d'usage
Minimum19 456 (19 Mio)21Connexion interactive (moins d'1 seconde)
Recommandé65 536 (64 Mio)34Application web standard
Haute sécurité262 144 (256 Mio)48Données sensibles, comptes admin

Pour bcrypt, l'OWASP recommande un facteur de coût minimum de 12 (à monter vers 13+ avec le temps).

Erreurs Courantes

1. Utiliser un hachage rapide (MD5, SHA-1, SHA-256)

// NE JAMAIS FAIRE CECI
const hash = crypto.createHash('sha256').update(password).digest('hex');

Cela hache à des gigaoctets par seconde. Un attaquant avec un seul GPU cassera toute votre base d'utilisateurs en quelques jours.

2. Ne pas saler

Sans un sel aléatoire unique par utilisateur, un attaquant utilise des tables arc-en-ciel — des hashes pré-calculés pour des milliards de mots de passe courants.

// Faux : même sel pour tout le monde
const hash = bcrypt.hash(password, '$2b$10$saltCommunATousLesUtilisateurs');

// Juste : sel aléatoire par utilisateur (géré automatiquement par les libs bcrypt/argon2)
const hash = bcrypt.hash(password, 12);

3. Re-hacher à chaque connexion

Certains développeurs re-hachent le mot de passe à chaque connexion réussie, pensant ajouter de la sécurité. Ce n'est pas le cas — cela gaspille du CPU et crée des conditions de course sur les serveurs multi-threads. Hachez une fois, stockez les paramètres, vérifiez à la connexion.

4. Stocker le hash dans un champ trop court

Avec bcrypt, le hash fait exactement 60 caractères. Avec Argon2id, il en fait 80-100+ selon les paramètres. Assurez-vous que votre colonne de base de données est assez grande.

-- PostgreSQL
ALTER TABLE users ADD COLUMN password_hash TEXT;  -- pas VARCHAR(50)

5. Utiliser des facteurs de coût obsolètes

bcrypt cost 10 était raisonnable en 2010. En 2026, il faut cost 12 minimum, 13+ de préférence. Les paramètres Argon2id devraient être revus tous les 2 ans à mesure que le matériel accélère.

Stratégie de Migration : bcrypt → Argon2id

Pas besoin de migrer tous les utilisateurs d'un coup. Utilisez une approche de « migration paresseuse » :

async function verifyAndMigrate(password, storedHash) {
  if (await argon2.verify(storedHash, password)) {
    // Vérifier si c'était un ancien hash bcrypt
    if (storedHash.startsWith('$2b

À la prochaine connexion réussie, le mot de passe de l'utilisateur est silencieusement re-haché avec Argon2id. Après 90 jours, plus de 90 % des utilisateurs actifs sont migrés.

Comment VaultKeepR Utilise Argon2id

VaultKeepR utilise Argon2id comme fonction de dérivation de clé pour la clé maîtresse de votre coffre. Les paramètres sont réglés pour le matériel moderne (64 Mio mémoire, 3 itérations, parallélisme 4) et réévalués à chaque version. Combiné à XChaCha20-Poly1305 pour le chiffrement du coffre, cela vous offre une sécurité à l'état de l'art sans les compromis historiques de bcrypt.

→ Lire notre pile cryptographique détaillée | → Pourquoi VaultKeepR est zero-knowledge

Recommandation Finale

Cas d'usageRecommandation
Nouvelle application en 2026Argon2id avec les paramètres recommandés par l'OWASP
Système bcrypt existantGarder bcrypt pour l'instant, migrer paresseusement vers Argon2id
Wallet crypto / dérivation de clé matérielleArgon2id avec forte mémoire (256 Mio+)
IoT / appareil embarquéscrypt avec des paramètres conservateurs
Performance maximale (vous savez ce que vous faites)Argon2id, réglé pour votre matériel spécifique

En résumé : en 2026, si vous démarrez un nouveau projet, utilisez Argon2id. Il n'y a aucune bonne raison de choisir bcrypt pour du code neuf, et même scrypt montre son âge. Argon2id est le choix moderne, recommandé par l'OWASP et adapté au futur.


Besoin d'aide pour auditer votre implémentation de stockage de mots de passe ? Contactez-nous — nous réalisons des revues de sécurité pour les projets open source.

) || storedHash.startsWith('$2a

À la prochaine connexion réussie, le mot de passe de l'utilisateur est silencieusement re-haché avec Argon2id. Après 90 jours, plus de 90 % des utilisateurs actifs sont migrés.

Comment VaultKeepR Utilise Argon2id

VaultKeepR utilise Argon2id comme fonction de dérivation de clé pour la clé maîtresse de votre coffre. Les paramètres sont réglés pour le matériel moderne (64 Mio mémoire, 3 itérations, parallélisme 4) et réévalués à chaque version. Combiné à XChaCha20-Poly1305 pour le chiffrement du coffre, cela vous offre une sécurité à l'état de l'art sans les compromis historiques de bcrypt.

→ Lire notre pile cryptographique détaillée | → Pourquoi VaultKeepR est zero-knowledge

Recommandation Finale

Cas d'usageRecommandation
Nouvelle application en 2026Argon2id avec les paramètres recommandés par l'OWASP
Système bcrypt existantGarder bcrypt pour l'instant, migrer paresseusement vers Argon2id
Wallet crypto / dérivation de clé matérielleArgon2id avec forte mémoire (256 Mio+)
IoT / appareil embarquéscrypt avec des paramètres conservateurs
Performance maximale (vous savez ce que vous faites)Argon2id, réglé pour votre matériel spécifique

En résumé : en 2026, si vous démarrez un nouveau projet, utilisez Argon2id. Il n'y a aucune bonne raison de choisir bcrypt pour du code neuf, et même scrypt montre son âge. Argon2id est le choix moderne, recommandé par l'OWASP et adapté au futur.


Besoin d'aide pour auditer votre implémentation de stockage de mots de passe ? Contactez-nous — nous réalisons des revues de sécurité pour les projets open source.

)) { const newHash = await argon2.hash(password, { type: argon2.argon2id, memoryCost: 65536, timeCost: 3, parallelism: 4, }); await db.updateUserHash(userId, newHash); } return true; } return false; }

À la prochaine connexion réussie, le mot de passe de l'utilisateur est silencieusement re-haché avec Argon2id. Après 90 jours, plus de 90 % des utilisateurs actifs sont migrés.

Comment VaultKeepR Utilise Argon2id

VaultKeepR utilise Argon2id comme fonction de dérivation de clé pour la clé maîtresse de votre coffre. Les paramètres sont réglés pour le matériel moderne (64 Mio mémoire, 3 itérations, parallélisme 4) et réévalués à chaque version. Combiné à XChaCha20-Poly1305 pour le chiffrement du coffre, cela vous offre une sécurité à l'état de l'art sans les compromis historiques de bcrypt.

→ Lire notre pile cryptographique détaillée | → Pourquoi VaultKeepR est zero-knowledge

Recommandation Finale

Cas d'usageRecommandation
Nouvelle application en 2026Argon2id avec les paramètres recommandés par l'OWASP
Système bcrypt existantGarder bcrypt pour l'instant, migrer paresseusement vers Argon2id
Wallet crypto / dérivation de clé matérielleArgon2id avec forte mémoire (256 Mio+)
IoT / appareil embarquéscrypt avec des paramètres conservateurs
Performance maximale (vous savez ce que vous faites)Argon2id, réglé pour votre matériel spécifique

En résumé : en 2026, si vous démarrez un nouveau projet, utilisez Argon2id. Il n'y a aucune bonne raison de choisir bcrypt pour du code neuf, et même scrypt montre son âge. Argon2id est le choix moderne, recommandé par l'OWASP et adapté au futur.


Besoin d'aide pour auditer votre implémentation de stockage de mots de passe ? Contactez-nous — nous réalisons des revues de sécurité pour les projets open source.

Share𝕏in

Ready to take control of your passwords?

VaultKeepR is the first decentralized password manager. Zero-knowledge. Wallet-native. Yours.

Try VaultKeepR →