Outils de développement · Calculateur de hachage SHA
Hex, Base64 et Raw Bytes : trois façons d'écrire le même résumé SHA
· Comment ça marche
sha-256 base64 codage formats de fichiers
sha256sum imprime en hexadécimal, package-lock.json stocke base64 et Docker utilise un préfixe sha256:. Ils peuvent tous être les mêmes 32 octets. Cet article explique chaque représentation et comment convertir entre elles.
Les hachages qui semblent différents mais concordent : une chaîne de fichier de verrouillage et une somme de contrôle de terminal pour le même fichier
Un résumé SHA-256 est fondamentalement 32 octets. La façon dont vous écrivez ces octets détermine à quoi ressemble le résumé. Un résumé, 32 octets identiques, apparaît sous la forme de 64 caractères hexadécimaux (deux par octet) ou de 44 caractères base64 (environ quatre pour trois octets), ou de longueurs et de formats différents en fonction de l'encodage. La confusion survient car un fichier de verrouillage peut afficher une représentation et un terminal en affiche une autre, tous deux pour les mêmes octets 32 sous-jacents.
Comprendre l'encodage est l'étape qui permet de se demander « Pourquoi sont-ils différents ? » dans "Je peux confirmer que ce sont les mêmes." Les trois représentations sont équivalentes une fois que vous les décodez en octets.
Un résumé est constitué d'octets : 20, 32, 48 ou 64 selon l'algorithme, avant tout encodage de texte.
Avant qu'une représentation textuelle n'existe, le résultat est un ArrayBuffer d'octets de résumé. ToolAcre enveloppe ce tampon avec Uint8Array, puis écrit chaque octet sous la forme de deux chiffres hexadécimaux ou convertit chaque octet en caractère binaire avant d'appeler btoa. Aucun des deux formateurs ne réexécute le hachage et aucun des deux ne modifie un seul bit de résumé.
La largeur d'octet suit l'algorithme sélectionné dans cet outil : SHA-1 renvoie vingt octets, SHA-256 trente-deux, SHA-384 quarante-huit et SHA-512 soixante-quatre. Il s’agit de sorties prises en charge vérifiées par les métadonnées et les tests de l’algorithme. Les octets bruts sont appropriés pour la comparaison programmatique ; hex et base64 sont des notations de transport pour les canaux qui attendent du texte.
Hex — deux caractères par octet, pourquoi il domine les outils de ligne de commande et la question du cas
La représentation hexadécimale utilise les chiffres 0-9 et les lettres A-F (ou a-f) pour représenter les 16 valeurs possibles d'un quartet 4 bits. Deux chiffres hexadécimaux représentent un octet. Le résumé SHA-256 de l'abc d'entrée est de 32 octets, il s'affiche donc sous la forme de 64 caractères hexadécimaux : ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Il s’agit du format imprimé par la plupart des outils de ligne de commande. L'hexadécimal est lisible par l'homme et sans ambiguïté ; chaque octet est représenté à chaque fois par exactement les deux mêmes caractères.
Hexadécimal est le format par défaut pour les sommes de contrôle et les hachages dans la documentation et sur la ligne de commande. Il est facile à lire et à copier, et il n'y a pas de remplissage, pas de respect de la casse dans l'interprétation (bien que la convention dicte systématiquement les minuscules ou les majuscules) et aucun caractère spécial devant être échappé dans les URL ou JSON. L'inconvénient est qu'il prend deux fois plus de caractères que d'octets bruts, c'est pourquoi d'autres formats existent.
Base64 et base64url — environ quatre caractères pour trois octets, remplissage et emplacement de chacun (SRI, npm, empreintes digitales SSH)
Base64 code trois octets sous forme de quatre caractères tirés d'un alphabet de 64 caractères : A-Z, a-z, 0-9, +, /. Les trois octets 61 62 63 (le Les codes ASCII pour abc) codent comme YWJj en base64. Un résumé complet de 32 octets SHA-256 code environ 44 caractères base64. Le remplissage avec des caractères = amène la longueur de sortie à un multiple de 4, donc 44 caractères plus 0 remplissage (car 32 est un multiple de 3, aucun remplissage n'est nécessaire). Le décodage inverse le processus : quatre caractères en base64 sont décodés en trois octets.
Base64 apparaît dans les fichiers package-lock.json, npm rétractable, les attributs SRI (Subresource Integrity) en HTML et les empreintes digitales de clé SSH. Il est compact : environ 33 % plus long que les octets bruts, contre 100 % plus long en hexadécimal. Le compromis est que toutes les représentations textuelles ne sont pas également faciles à lire ; base64 semble plus brouillé à l'œil humain qu'hexadécimal.
Formes préfixées — sha256 : dans les résumés de conteneurs, sha384- dans les attributs d'intégrité, SHA256 : dans SSH
Base64url est une variante définie dans la RFC 4648 qui remplace - et _ pour + et /. L'alphabet devient A-Z, a-z, 0-9, -, _. Les JWT utilisent base64url car + et / ont des significations particulières dans les URL (+ peut être lu comme un espace dans les chaînes de requête, / est un séparateur de chemin). Un segment JWT est toujours codé en base64url, et un décodeur qui insiste sur la base64 standard le rejettera. À l’inverse, un décodeur d’url base64 qui n’accepte pas l’alphabet standard échouera sur base64 standard.
Le remplissage est facultatif dans base64url. Coussinets base64 standard avec = pour garantir que la longueur de sortie est un multiple de 4. Base64url omet généralement le remplissage car = est lui-même gênant en termes d'URL. Un décodeur doit accepter l'url base64 avec ou sans remplissage, et l'encodeur doit être explicite sur ce qu'il produit. L'outil ToolAcre base64 accepte les deux alphabets et tolère le remplissage manquant en entrée, et vous permet de choisir le format en sortie.
Exemple concret : un résumé converti de hexadécimal en base64 et inversement, avec les limites d'octets marquées
Les formulaires préfixés ajoutent un identifiant de schéma au résumé. Les résumés d'images Docker utilisent sha256:ba7816bf..., où sha256: est le préfixe. Les empreintes digitales SSH utilisent SHA256 :, avec deux points. Certains outils utilisent sha256= ou SHA256= (avec un signe égal). Le préfixe est purement informatif ; il vous indique quel algorithme a produit le résumé. La suppression du préfixe laisse les mêmes octets dans le même codage.
Lors de la comparaison des résumés, le préfixe est bruit. Si un outil imprime SHA256:ba78... et un autre imprime ba78..., il s'agit du même résumé ; le préfixe n'est que des métadonnées sur le format. De même, les préfixes comme sha256:- (utilisés dans certains contextes de conteneurs) ou sha384- (utilisés dans les attributs d'intégrité) sont des conventions de formatage qui ne modifient pas les octets. Retirez-les pour comparaison.
Ce que cela ne couvre pas : quel codage émet un outil donné ; vérifiez le format de sortie avant de comparer
Un résumé, le SHA-256 de l'abc d'entrée, apparaît sous plusieurs formes : hexadécimal (64 caractères), base64 avec remplissage (44 caractères), base64url avec remplissage (44 caractères, avec - et _ au lieu de + et /), ou avec divers préfixes. Pour confirmer qu'ils sont les de même, décodez chacun en octets et comparez les octets. La représentation hexadécimale ba7816bf... décode en octets 0xba 0x78 0x16 0xbf 0x8f 0x01 0xcf 0xea... La représentation base64 se convertit en la même séquence d'octets une fois décodée.
La calculatrice de hachage ToolAcre SHA affiche par défaut le format hexadécimal. Si vous avez besoin de base64, vous pouvez utiliser un outil distinct pour convertir l'hexadécimal en base64, ou utiliser l'utilitaire base64 sur le même site pour encoder directement le texte. Les outils conçus pour des contextes spécifiques (npm pour package-lock.json, Docker pour les résumés d'images) sortent dans le format attendu par leur contexte. Comprendre qu'il s'agit tous des mêmes 32 octets dans des vêtements différents élimine toute confusion lorsque les outils ne sont pas d'accord sur le format.
À retenir : comparez les octets, pas les chaînes - calculez le résumé avec le calculateur de hachage ToolAcre SHA, puis convertissez-le en la représentation que vous vérifiez.
Pour convertir manuellement un résumé hexadécimal en base64, regroupez les chiffres hexadécimaux en octets, convertissez chaque octet en décimal, puis encodez en utilisant l'alphabet base64. L'octet 0xba (hex ba) est décimal 186 ; 0x78 est 120 ; 0x16 est 22 ; 0xbf est 191. Le regroupement de ces quatre octets et le codage en base64 donnent les caractères w (0 + 22 dans l'alphabet), as (codage 186), AA (codage 120), vw (codage 191). Le résumé complet nécessite de faire cela 10 fois et de compléter si nécessaire. Ce processus manuel est instructif mais fastidieux ; un outil de conversion base64 le rend instantané.
L'idée clé est qu'un résumé est constitué d'abord d'octets et que la représentation textuelle est secondaire. Chaque codage des mêmes octets décode les mêmes octets et est donc interchangeable à des fins de vérification de l'intégrité. Les différences de casse en hexadécimal, les différences de remplissage en base64, les préfixes et l'espacement sont tous des choix de formatage qui n'affectent pas la valeur réelle. Lorsque vous maîtrisez la capacité de conversion entre les représentations, les incompatibilités de format de résumé deviennent des problèmes de débogage que vous pouvez résoudre au lieu de mystères.