C’est quoi un checksum ?

Définitions

Wikipedia:

La somme de contrôle ou checksum en anglais, parfois appelée « empreinte », est un nombre qu’on ajoute à un message à transmettre pour permettre au récepteur de vérifier que le message reçu est bien celui qui a été envoyé. L’ajout d’une somme de contrôle à un message est une forme de contrôle par redondance.

On peut prendre comme checksum simplement un bit de parité, qui nous donne un minimum de redondance. Dans ce cas, il y a 50% de chance pour que deux messages aient le même checksum.

Une autre manière pour calculer un checksum (aussi appelé CRC) est d’utiliser une fonction de hachage.

Une fonction de hachage génère une empreinte de longueur fixe (disons n bits) et différente pour chaque message, On dit que c’est une fonction résistante aux collisions.

Théoriquement, il existe forcement des collisions (deux messages donnant la même empreinte). En effet la fonction est strictement surjective étant donné que l’ensemble d’arrivé (les messages de longueur n, fini, il y en a 2^n) est un sous ensemble de l’ensemble de départ (l’ensemble des messages de toutes les longueurs).

Cependant, on peut prouver que la probabilité de trouver une collision est négligeable pour ces fonctions, avec la puissance de calcul des ordinateurs actuels.

 

hachage et signature

Il est important de comprendre qu’un hash pas d’une signature. si vous envoyez un message avec un fichier et son hash, n’importe qui peut modifier le fichier et recalculer le hash.

Pour empêcher ce type d’attaque on utilise des algorithmes de signature qui requièrent des clé secrète, ainsi vous seul pouvez générer la signature. on parle alors de MAC (message authentication code). Je pense particulièrement à l’algorithme HMAC qui permet de créer une signature à partir de n’importe quel fonction de hachage, en y ajoutant une clé privé (symétrique, il est nécessaire d’avoir la même clé pour signer et pour vérifier le message), ou l’algorithme ECDSA, qui fonctionne de manière asymétrique (je signe le message avec ma clé privé et n’importe qui ayant la clé publique peut vérifier que c’est bien moi qui ai signé le message).

Cependant le hash à quand même de nombreuses application: par exemple, si on le stock sur un support non modifiable, sur un site web par exemple, on peut vérifier que le fichier qu’on vient de télécharger sur un site tiers est bien celui émis par l’éditeur.

Les  différents algorithmes

Sur linux vous pouvez par exemple faire:

pour obtenir le hash sha-256 d’un fichier.

Il existe une grande diversité de fonctions dont les noms peuvent parfois porter à confusion.

la famille sha2 (basée sur shacal-2):

SHA-256, SHA-384, SHA-512 principalement

la famille sha3 (basée sur l’algorithme Keccak):

SHA3-256, SHA3-384, SHA3-512 principalement.

 

Ainsi, le sha3 utilisé dans la blockchain Ethereum (voir web3 un peu plus loin) désigne le SHA3-256.

 

Et en Javascript, ça donne quoi ?

Voyons maintenant comment calculer le vrai checksum d’un fichier directement en javascript.

Pour cela nous aurons besoin de la librairie crypto-js qui peut être installée avec bower:

puis dans notre fichier html:

Bon ça reste pas très propre. On peut arranger un peu tout ça avec quelques promesses:

il nous restera plus qu’a faire :

et voila le travail.