En informatique et en cryptographie, un arbre de Merkle ou arbre de hachage est une structure de données contenant un résumé d'information d'un volume de données, généralement grand (comme un fichier).
Les arbres de hachage ont été inventés par Ralph Merkle en 1979[1].
Le principe d'un arbre de hachage est de pouvoir vérifier l'intégrité d'un ensemble de données sans les avoir nécessairement toutes au moment de la vérification.
Construction de l'arbre
Dans la figure, l'ensemble de données est représenté par les blocs[Quoi ?] L1 à L4. L'arbre est constitué par un ensemble de valeurs de hash[Quoi ?] interdépendantes. Les feuilles de l'arbre sont les valeurs de hash de chacun des blocs de données initiales. Dans un arbre de Merkle binaire, ces hashs sont alors concaténés deux à deux pour pouvoir calculer un nouveau hash parent. Ainsi de suite jusqu'au sommet de l'arbre où on obtient un hash-sommet. Si le nombre de blocs, ou les hashs intermédiaires ne forment pas un arbre binaire, on complète la base avec suffisamment de blocs vides.
Exploitation
Pour garantir l'intégrité d'un bloc téléchargé par rapport à l'ensemble des données, il suffit de posséder les hashs des frères, les hashs des oncles et le hash-sommet. De plus, seul le hash-sommet doit être récupéré de manière sûre pour garantir l'intégrité de l'ensemble des données représentées par l'arbre.
Par exemple, si on veut vérifier l'intégrité du bloc L2, il suffit d'avoir récupéré le hash0-0 (son frère), le hash1 (son oncle) et le hash-sommet.
Actuellement, les arbres de hachage sont très utilisés dans les réseaux pair à pair, car ils permettent de vérifier l'intégrité d'une partie d'un fichier. En effet, il suffit alors de connaître le bon nœud se situant à la hauteur nécessaire dans l'arbre, sans nécessairement devoir posséder tout le fichier.
La fonction de hachage cryptographique MD6 utilise un arbre de Merkle, ce qui permet de tirer parti du parallélisme présent dans les ordinateurs modernes.
Les arbres de Merkle sont aussi utilisés dans le système de fichiers ZFS[2], dans le protocole Google Wave[3], dans le protocole de la cryptomonnaie Bitcoin[4] ou dans le logiciel de versionnement Git[5].