Le hachage perceptuel (perceptual hashing)

16 juillet 2018 · 4 min de lecture

En informatique, une signature numérique peut être créée pour chaque fichier. A la moindre modification de l’original, l’empreinte générée sera totalement différente. L’intérêt est de vérifier si le document a été altéré.

Par conséquent, si on redimensionne une image, les signatures sont différentes. Il est donc impossible via cette solution d’identifier deux images proches. Il faudra dans cette situation utiliser le hachage perceptuel.

Cas d’utilisation des fonctions de hachage

  • Un fournisseur envoie un document à son client, accompagné de son empreinte numérique. Le client pourra calculer l’empreinte sur le document reçu et vérifier qu’elle correspond bien à celle qui a été transmise.
  • De la même manière, un éditeur propose un logiciel en téléchargement. L’internaute calculera le condensat sur le fichier pour le comparer avec celui qui est inscrit sur le site, afin de s’assurer qu’il n’est pas corrompu ni modifié par un tiers.
  • Dans la base de données d’un site web, les mots de passe sont “hachés” menu avant d’être enregistrés. Si les données fuitent les pirates n’auront pas les mots de passe humainement lisibles. En fait, pour vous identifier, à chaque connexion le site web calcule le hash de votre mot de passe pour le comparer à celui stocké en base.

Comment créer un hash ?

Les fonctions de hachage MD5 et SHA1 sont les plus utilisées. Elles lisent en cascade chaque donnée binaire d’un fichier pour en déduire une chaîne de caractères de taille fixe. Le calcul est irréversible, on ne peut pas extraire le fichier source d’après sa signature. Il existe des logiciels gratuits sur Windows pour calculer ces empreintes cryptographiques. Les commandes md5sum et sha1sum sont disponibles dans le terminal Linux.

waterlily

Voici une image nommée waterlily.jpg. Sa taille est 640x360 pixels. Calculons sa signature numérique :

md5sum waterlily.png
# résultat: 6a9e70e1def784f6e26027c7c914a702
sha1sum waterlily.png
# résultat: d0edc2c6d65ee79441f78dc149e08df79d348e5e

L’image est redimensionnée en 500x280 pixels :

md5sum waterlily.png
# résultat: b2b3ee10491bc1486bcadd19397a769e
sha1sum waterlily.png
# résultat: d43c780ef66e8e6eed9aaf38a25c827cc89219d7

Comme vous pouvez le constater le résultat est totalement différent. Cela prouve que l’original a été altéré. Et c’est le but de ces empreintes numériques.

Mais dans le cas de fichiers multimédias, si on veut vérifier qu’une image est dérivée d’une autre, il est préférable d’utiliser le hachage perceptuel.

Qu’est-ce que le hachage perceptuel ?

C’est un algorithme qui produit une empreinte numérique particulièrement adaptée aux fichiers multimédias. L’intérêt est que le résultat est proche si les fichiers le sont, contrairement aux algorithmes précédents. Il est utilisé pour détecter les violations de droits d’auteurs sur des images, des articles, des fichiers audio, ou en criminalistique numérique.

Démonstration

Dans cet exemple la librairie Javascript Jimp est utilisée.

Reprenons le nénuphar précédent et calculons son hash perceptuel :

const Jimp = require("jimp");

Jimp.read('waterlily.jpg', function (err, image) {
	console.log('hash waterlily : ' + image.hash());
    });

Résultat :

hash waterlily : cipbA1M9j42

Effectuons une retouche sur l’image originale :

waterlily

En reprenant le code précédent, le hash de cette nouvelle image est :

hash waterlilycopyright : d6pbA1M9i02

Seules quelques lettres ont changé. On peut calculer la “distance” entre ces deux images :

const Jimp = require("jimp");

let img1 = 'waterlily.jpg';
let img2 = 'waterlilycopyright.jpg';

Jimp.read(img1, function (err, image1) {
  console.log('hash waterlily : ' + image1.hash());

  Jimp.read(img2, function (err, image2) {
    console.log('hash waterlilycopyright : ' + image2.hash());
    console.log('distance : ' + Jimp.distance(image1, image2));
    });
  });

Résultat :

hash waterlily : cipbA1M9j42
hash waterlilycopyright : d6pbA1M9i02
distance : 0.078125

A une distance de 0, les images sont identiques, à 1 elles sont très éloignées visuellement. Il est estimé une correspondance à une distance inférieure à 0.15, ce qui est le cas ici.

J’ai pu vérifier qu’une image redimensionnée a exactement le même hash que l’originale.

Conclusion

Grâce au hachage perceptuel, on peut donc automatiser des tests, pour rechercher par exemple d’après une liste de hash d’images connues, celles qui ont été copiées et retouchées parmi un lot d’images donné.

Attention ! cela ne fonctionne pas pour retrouver des images similaires. Deux photos d’une même scène avec un cadrage différent et une faible variation d’objets auront des empreintes trop différentes et donc une distance ne permettant pas d’établir une correspondance.

Références

PARTAGER

A LIRE EGALEMENT