Cryptologie : différence entre hash, hmac, et pbkdf2

Cryptologie : différence entre hash, hmac, et pbkdf2

Dès lors qu’on s’intéresse à la cryptologie moderne, on tombe très vite sur ces 3 notions. Elles sont différentes, mais complémentaires. Elles sont très utilisées. La protection WPA2 du wifi, par exemple, utilise les 3.

Commençons par la notion de hash

Un hash, ou fonction de hachage en français, est une fonction qui prend en entrée un message de taille variable, pour en faire en sortie un résumé (appelé « digest » en anglais, ou « condensat » en Français) de taille fixe. Ce digest repose sur un algorithme étudié pour générer de très grandes variations dans le digest si le moindre bit du fichier d’entrée évolue. De plus, l’algorithme est théoriquement étudié pour que deux fichiers d’entrée différents donnent deux digests différents. Si deux fichiers d’entrée différents donnent le même digest, on dit qu’il y a une collision, ce qui n’est pas le cas souhaité.

Ces fonctions de hachage servent souvent à conserver un mot de passe sous forme chiffrée en mémoire ou sur un disque dur. En effet, si le support est compromis, le fait de retrouver le mot de passe haché est quasi impossible puisque la fonction de hachage n’est pas réversible.

Les deux algorithmes de hachage les plus connus sont MD5 et SHA. MD5, qui date de 1991, est obsolète et n’est presque plus utilisé. Il génère des condensats de 32 octets. SHA-1 date de 1995 et est considéré comme plus robuste que MD5, bien que les puissances de calcul modernes le rendent moins sûr. Il génère des condensats de 20 octets. SHA-1 est en passe de se faire détrôner par SHA-256.

Voir en fin d’article le code source pour mettre en œuvre SHA-1 dans un programme en langage C.

Passons maintenant à la notion de HMAC (Keyed hash message authentication code)

Un HMAC fait la même chose qu’un hash, mais prend en entrée, en plus du fichier à condenser, une clé. L’avantage se comprend immédiatement, en plus de prouver l’intégrité d’un message (ce que fait le hash, lorsqu’il est utilisé en signature), le HMAC peut prouver l’authenticité d’un message (seul celui qui dispose de la clé a pu calculer la signature). Casser un HMAC est plus dur que casser un hash puisqu’en plus d’une infinité de fichiers d’entrée possibles, il y a aussi une infinité de clés possibles.

Le hmac est défini comme étant :

Dans la formule ci-dessus, h est une fonction de hachage (SHA-1 par exemple, on parle alors de HMAC-SHA1, mais on peut aussi évidemment faire du HMAC-MD5). La robustesse du HMAC est intimement liée à la robustesse de l’algorithme de hachage utilisé. Le symbole + représente l’opération logique XOR (ou exclusif) et || la concaténation.

On voit que l’algorithme utilise deux tampons opad et ipad, ils sont utilisés comme suit :

Un exemple de calcul de HMAC-SHA1 est donné en langage C à la fin de cet article.

Venons en maintenant au PBKDF2

PBKDF2 signifie “Password key derivation Function 2”. C’est une fonction, la deuxième du nom comme son nom l’indique, qui est définie dans la norme RFC2898 et dans la norme PKCS (Public Keys Cryptographic Standard) #5 V2.0

Cette fonction est miraculeuse car elle permet, à partir d’un mot de passe secret relativement simple de générer des clés de chiffrement de la taille que l’on souhaite.

La fonction prend 5 paramètres en entrée :

PBKDF2 (PRF, Password, Sel, nbre d’itération, longueur de clé désirée)

PRF peut être une fonction de type HMAC (HMAC-SHA1 par exemple).

La fonction itère un grand nombre de fois, en moulinant sur du HMAC, ce qui rend très difficile l’attaque par force brute, ainsi que l’attaque par Rainbow tables.

SHA-1, HMAC-SHA1 et PBKDF2 appliqués au Wifi WPA2

Le chiffrement wpa2 du wifi utilise toutes ces notions comme évoqué précédemment.

La fonction pbkdf2 est appelée avec une fonction PRF qui est HMAC-SHA1 (qui elle même utilise SHA1 si vous avez bien suivi), un password qui est le mot de passe qui protège la box wifi, un sel qui est le SSID (nom du réseau) wifi, un nombre d’itération égal à 4096. Cette fonction génère une clé de 32 octets appelée PMK.

A partir de cette clé PMK, est calculée une clé PTK, avec PTK=PRF(PMK, 32, “Pairwise key expansion”, 22, data, 76, PTK, 512), dans laquelle data est la concaténation sur 76 octets de minimum (adresse mac point d’accès, adresse mac client), maximum (adresse mac point d’accès, adresse mac client), minimum (nonce point d’accès, nonce client), maximum (nonce point d’accès, nonce client)

Le code source de cette fonction PRF est le suivant (on voit qu’elle aussi utilise un HMAC-SHA1):

Voilà, vous êtes maintenant incollable sur ces notions de hash, hmac-sha1 et pbkdf2.

Chose promise, chose due (et c’est un beau cadeau si vous faites de la crypto parce que ces fonctions, en tout cas dans leur version qui marche bien, ne sont pas si faciles à trouver sur le net), voici une petite archive C contenant tout ce qu’il faut pour utiliser SHA1, HMAC-SHA1 et pbkdf2 dans vos propres programmes.