Regex empreinte SHA-256 (hexadécimal)
Une empreinte SHA-256 (FIPS 180-4) fait 256 bits, soit 64 chiffres hexadécimaux. Les tentatives relues sont plus ou moins strictes : validator.js ancre et accepte majuscules et minuscules, la spécification OCI des images ne prévoit que a-f minuscules et la décrit sans ancres, l'outil IOC de InQuest (iocextract) cherche l'empreinte dans un texte et accepte donc « x » collé devant ou « z » derrière, et hashID accepte un suffixe « :sel » arbitraire. Voici un motif ancré qui accepte les deux casses et rien d'autre, comparé à ces tentatives.
/^[a-fA-F0-9]{64}$/passe 25/25 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js (isHash, sha256) — identique à la recommandation : sert de référence | ^[a-fA-F0-9]{64}$ | 25 / 25 | sûr |
| OCI image-spec — « /[a-f0-9]{64}/ » sans ancres et minuscules seules : 65 caractères, « x » collé et majuscules (refusées) sont mal traités | [a-f0-9]{64} | 14 / 25 | sûr |
| iocextract (InQuest) — conçu pour extraire d'un texte : « x » ou « z » collés autour passent, 65 chiffres refusés par les frontières | (?:[^a-fA-F\d]|\b)([a-fA-F\d]{64})(?:[^a-fA-F\d]|\b) | 18 / 25 | sûr |
| hashID — accepte un suffixe « :… » arbitraire (sel) après les 64 chiffres | ^[a-f0-9]{64}(:.+)?$ | 24 / 25 | sûr |
Implémentation
const re = new RegExp("^[a-fA-F0-9]{64}$", "");
re.test(input);Limites
- Valide seulement la FORME : 64 chiffres hexadécimaux. Rien ne distingue un SHA-256 d'un autre condensé de 256 bits (SHA3-256, BLAKE2s, SHA-512/256…), ni d'une chaîne hexadécimale quelconque de 64 caractères.
- Les préfixes « sha256: » (OCI, Docker) et « 0x » sont refusés ; retirez-les avant validation. Les deux casses sont acceptées : normalisez en minuscules pour comparer deux empreintes.
- Ne dit rien de l'intégrité : seule la comparaison avec une empreinte recalculée la prouve.