SHA-256 est une procédure précisément définie qui calcule une empreinte des données, appelée hash. Une même entrée donne toujours le même résultat de 256 bits : 32 octets, généralement écrits sous forme de 64 caractères hexadécimaux. Bitcoin l’utilise pour relier et vérifier des données, ainsi que pour le minage. Cette empreinte n’est toutefois pas une copie chiffrée du contenu initial.
Imaginez que l’on vous envoie un fichier et son hash. En refaisant le calcul, vous pouvez vérifier que les données téléchargées correspondent à cette empreinte. Même une petite modification de l’entrée change très probablement le résultat dans son ensemble. L’empreinte seule ne dit cependant ni qui a créé le fichier ni s’il est sûr. Si un attaquant fournit un fichier malveillant et son hash, les deux correspondront. La fiabilité de la source de la valeur de référence compte donc aussi. [1] [5]
Pour les trois octets ASCII abc, sans guillemets ni saut de ligne, le résultat est ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Ce n’est pas un nombre tiré au hasard : toute implémentation correcte obtient ce résultat à partir de ces mêmes octets. Ajouter une espace ou un saut de ligne modifie l’entrée. Un hash différent ne signifie alors pas que l’algorithme est défectueux. L’encodage du texte compte lui aussi. [3]
Le chiffrement permet de retrouver un message à l’aide d’une clé. SHA-256 n’a ni cette clé ni de procédure inverse. Cela n’empêche pas d’essayer des entrées probables : si quelqu’un soupçonne que vous avez haché un PIN à quatre chiffres, il peut tester les 10 000 combinaisons et comparer les résultats. Un long hash n’ajoute donc pas l’entropie (le caractère imprévisible de l’entrée) qui manque à un secret faible. La sécurité dépend aussi du nombre de possibilités que l’attaquant doit réellement examiner. [5] [7]
Les identifiants de blocs, txid (identifiants de transactions) et la combinaison de paires d’empreintes dans un Merkle Tree (un arbre de hash reliés entre eux) utilisent SHA256(SHA256(data)). Le second passage traite les 32 octets bruts du premier résultat, pas sa représentation textuelle de 64 caractères. La sortie conserve 256 bits. Ce double hachage est une règle du protocole, pas la preuve que SHA-256 simple est cassé. Bitcoin emploie aussi d’autres constructions : Taproot ajoute par exemple des tags prédéfinis à l’entrée pour distinguer les différents usages du hachage. [2] [4] [6]
Un mineur modifie de façon répétée les champs autorisés d’un en-tête de bloc candidat et calcule son double SHA-256. Il cherche un résultat qui, interprété comme un nombre, ne dépasse pas le target (seuil numérique) fixé. Il ne déchiffre pas un message et ne cherche pas la clé privée de quelqu’un. Trouver un en-tête convenable demande de nombreux essais ; le vérifier est rapide. L’en-tête fait aussi référence au bloc précédent : modifier un ancien bloc rompt les liens qui suivent. Un Full Node (un nœud qui vérifie lui-même les règles de Bitcoin) vérifie en plus les transactions et les autres règles. Un hash conforme ne suffit pas à rendre valide un bloc invalide. [4]
Il existe davantage de messages possibles que d’empreintes de 256 bits. Certaines entrées différentes partagent donc nécessairement le même hash : c’est une collision. La question est de savoir si l’on peut en trouver une délibérément. Pour un hash idéal de 256 bits, une recherche générique de collision demande de l’ordre de 2^128 essais ; trouver une entrée correspondant à une empreinte fixée à l’avance, de l’ordre de 2^256. Ce sont deux problèmes différents. Une collision ne révèle pas à elle seule une clé privée Bitcoin. Ces chiffres ne garantissent pas non plus la sécurité d’un portefeuille ou d’un protocole entier. [5]
SHA-256 est un composant, pas une solution complète à tous les problèmes de sécurité. Il est volontairement rapide : utilisé seul, il convient mal au stockage de mots de passe choisis par des humains, car un attaquant peut tester rapidement ses hypothèses. Des procédés spécifiques de dérivation de mot de passe servent à cela, avec par exemple un coût de calcul réglable. De même, la recette maison « je hache quelque chose et j’obtiens une clé sûre » ne résout ni le manque de hasard initial ni la divulgation de l’entrée. L’utilisateur n’a généralement pas à calculer SHA-256 à la main, mais doit comprendre ce qu’une empreinte vérifiée prouve, et ce qu’elle ne prouve pas. [8] [7]
SHA-256 appartient à la famille SHA-2 ; NIST FIPS 180-4 décrit son fonctionnement. Avant le calcul, il complète l’entrée, notamment avec sa longueur, puis la traite par fragments de 512 bits, chacun en 64 tours. Ces blocs internes font 64 octets et ne sont pas des blocs Bitcoin. Un en-tête de bloc Bitcoin fait 80 octets ; le bloc entier contient aussi des transactions. Le nombre 256 désigne la longueur de l’empreinte obtenue, pas la taille du bloc ou d’une clé privée. [1] [4]
Pour une vision complète, lisez aussi Hash, Proof of Work, Block Header, Adresse Bitcoin, Merkle Tree, Bitcoin. Cette entrée est également citée par Hash, ASIC Miner, Hashrate, Nonce.