Rexact
Cheatsheet

Regex hachage bcrypt

Un hachage bcrypt a 60 caractères : « $2b$ » (version), le coût sur deux chiffres, « $ », puis 53 caractères de l'alphabet « ./A-Za-z0-9 » (22 de sel et 31 d'empreinte). La page de manuel d'OpenBSD (crypt(3)) donne l'exemple « $2b$12$FPWWO2RJ3CK4FINTw0Hi8OiPKJcX653gzSS.jqltHFMxyDmmQ0Hqq ». Les tentatives relues divergent : Spring Security n'ancre pas la fin (un 54e caractère passe) et accepte tout coût sur deux chiffres, Name-That-Hash fait de même, hashID refuse la version « $2b$ » apparue après lui. Voici un motif qui borne le coût à 04-31, comparé à ces tentatives.

/^\$2[abxy]\$(?:0[4-9]|[12][0-9]|3[01])\$[./A-Za-z0-9]{53}$/
passe 24/24 cas

Comparatif des patterns existants

Implémentation

const re = new RegExp("^\\$2[abxy]\\$(?:0[4-9]|[12][0-9]|3[01])\\$[./A-Za-z0-9]{53}$", "");
re.test(input);

Limites

  • Valide seulement la FORME : 60 caractères, version, coût 04-31, alphabet. Rien ne prouve qu'une chaîne soit un vrai hachage bcrypt ni qu'elle corresponde à un mot de passe ; la comparaison se fait avec la fonction de la bibliothèque (compare), jamais en réimplémentant le calcul.
  • La borne 04-31 du coût vient des implémentations, pas de la page de manuel OpenBSD ; la version historique « $2$ » (sans lettre) est refusée. Les variantes $2a$/$2x$/$2y$ sont celles de crypt_blowfish ; elles ne sont pas toutes équivalentes (voir la documentation de crypt_blowfish).
  • Les hachages d'autres schémas (Argon2, scrypt, MD5-crypt, SHA-crypt) sont refusés : le préfixe doit être $2a$, $2b$, $2x$ ou $2y$. Aucun mot de passe réel dans les exemples.

Pages liées