Représenter un hachage diffère du réencodage de son texte

Un résultat SHA-256 contient 256 bits, soit 32 octets. Base16 du RFC 4648 représente chaque octet par deux chiffres hexadécimaux : 64 caractères. Base64 standard avec remplissage représente les mêmes 32 octets par 44 caractères. Encoder la chaîne hexadécimale de 64 caractères comme texte UTF-8 utilise plutôt 64 octets et produit 88 caractères Base64. Ce résultat encode le texte affichant le hachage, pas ses octets bruts.

Octets bruts du hachage : 32 octets vers 44 caractères Base64 ; texte HEX : 64 octets vers 88 caractères
Schéma original du flux d’octets. A représente les octets bruts du hachage ; B le texte HEX de 64 caractères. Les nombres Base64 44 et 88 comprennent le remplissage.

RFC 6234: SHA-256 digest size

RFC 4648 §4, §8: Base64 / Base16

Vérifier l’entrée avant d’utiliser les outils

Nous avons calculé SHA-256 de abc et reproduit les deux chemins en code. L’outil de hachage Moyoutil fournit du texte hexadécimal. Le coller dans l’outil Base64 encode les octets UTF-8 du texte et produit 88 caractères. Cet outil n’interprète pas HEX comme des octets bruts de hachage. L’exemple Web Crypto séparé distingue octets et texte HEX et affiche les deux longueurs.

const raw = new Uint8Array(await crypto.subtle.digest(
  'SHA-256', new TextEncoder().encode('abc')));
const hex = Array.from(raw,
  n => n.toString(16).padStart(2, '0')).join('');
const rawBase64 = btoa(String.fromCharCode(...raw));
const textBase64 = btoa(hex); // ASCII HEX text
console.log(raw.length, hex.length,
            rawBase64.length, textBase64.length);
// 32 64 44 88

Consultez la documentation du système destinataire pour connaître la représentation requise. Base64 ou Base64url, le remplissage et les données encodées sont des conditions distinctes. Une longueur correcte ne confirme pas une somme de contrôle identique. Cet article explique la conversion de représentation, pas la vérification de signatures ou la sécurité d’un fichier.

Questions fréquemment posées

La conversion en Base64 recalcule-t-elle le hachage ?

Non. Encoder les octets bruts change leur représentation. Encoder du texte HEX utilise des données différentes. Distinguez les deux opérations du recalcul de SHA-256 des données originales.