Authentification de Message avec HMAC en Cryptographie

LinuxBeginner
Pratiquer maintenant

Introduction

Dans le monde de la communication numérique, il est crucial de s'assurer que les messages sont non seulement conservés en privé, mais aussi qu'ils n'ont pas été altérés pendant le transit (intégrité) et qu'ils proviennent réellement de l'expéditeur revendiqué (authenticité). Bien que les fonctions de hachage simples puissent vérifier la corruption accidentelle des données, elles ne peuvent pas empêcher une falsification malveillante, car n'importe qui peut recalculer le hachage d'un message modifié.

C'est là qu'intervient le HMAC (Hash-based Message Authentication Code). Le HMAC est un type spécifique de Code d'Authentification de Message (MAC) qui combine une fonction de hachage cryptographique (comme SHA-256) avec une clé secrète. Seules les parties qui possèdent la clé secrète peuvent générer et vérifier le HMAC pour un message donné. Ce processus assure à la fois l'intégrité et l'authenticité des données.

Dans ce laboratoire, vous acquerrez une expérience pratique avec le HMAC. Vous commencerez par comprendre le concept, puis vous utiliserez l'outil puissant en ligne de commande openssl pour générer des clés et calculer des HMAC. Enfin, vous verrez comment implémenter le HMAC dans un script Python, une tâche courante dans le développement d'applications.

Introduction au HMAC

Dans cette étape, nous allons aborder le concept fondamental du HMAC et pourquoi il est essentiel pour une communication sécurisée.

Une fonction de hachage standard, comme SHA-256, prend un message en entrée et produit une chaîne de caractères de taille fixe, connue sous le nom de hachage ou digest. Si ne serait-ce qu'un seul bit du message est modifié, le hachage résultant sera complètement différent. C'est excellent pour vérifier l'intégrité des données. Cependant, cela n'assure pas l'authenticité. Si un attaquant intercepte et modifie un message, il peut simplement calculer un nouveau hachage pour le message falsifié et l'envoyer. Le destinataire n'aurait aucun moyen de savoir que le message a été altéré.

Le HMAC résout ce problème en introduisant une clé symétrique secrète dans le processus de hachage. Une clé symétrique est une information secrète partagée uniquement entre l'expéditeur et le destinataire prévu.

Le processus HMAC fonctionne approximativement comme suit :

  1. L'expéditeur combine la clé secrète avec le message.
  2. Une fonction de hachage (par exemple, SHA-256) est appliquée à cette combinaison.
  3. Le hachage résultant, appelé maintenant HMAC, est envoyé avec le message original.

Lorsque le destinataire reçoit le message et le HMAC, il effectue le même calcul en utilisant sa copie de la clé secrète.

  • Si le HMAC calculé correspond au HMAC reçu, le destinataire sait que le message n'a pas été altéré (intégrité) et qu'il provient de quelqu'un qui possède la clé secrète (authenticité).
  • Si les HMAC ne correspondent pas, le message est considéré comme compromis et doit être rejeté.

Cette étape est purement conceptuelle. Dans les étapes suivantes, vous mettrez cette théorie en pratique.

Générer la Clé Secrète HMAC

Dans cette étape, vous allez générer une clé secrète aléatoire et sécurisée qui est le fondement de la sécurité du HMAC. Une clé prévisible permettrait à un attaquant de forger des HMAC. Nous utiliserons l'outil openssl, un utilitaire polyvalent en ligne de commande pour la cryptographie.

Nous utiliserons la commande openssl rand pour générer des données aléatoires.

  • -hex: Cette option indique à openssl de produire les données aléatoires sous forme de chaîne hexadécimale.
  • 32: Ceci spécifie le nombre d'octets aléatoires à générer. 32 octets équivalent à 256 bits, ce qui est une longueur de clé forte et couramment utilisée, surtout lorsqu'elle est associée à l'algorithme de hachage SHA-256.

Pour faciliter l'utilisation de la clé dans les commandes suivantes, nous allons la générer et la stocker dans une variable d'environnement nommée HMAC_KEY. Exécutez la commande suivante dans votre terminal :

export HMAC_KEY=$(openssl rand -hex 32)

Cette commande exécute openssl rand -hex 32, et sa sortie (la clé hexadécimale) est capturée et assignée à la variable HMAC_KEY.

Vous pouvez visualiser la clé que vous venez de générer en utilisant la commande echo :

echo $HMAC_KEY

Vous devriez voir une longue chaîne de caractères hexadécimaux. Votre clé sera unique.

0db348c78473ce8460416f875cd87239d0f5f66fbe5103ba4b5c84cf2cd76914

Maintenant que vous disposez d'une clé secrète, vous êtes prêt à créer un HMAC.

Calculer HMAC-SHA256

Dans cette étape, vous allez calculer un HMAC pour un message d'exemple en utilisant la clé que vous avez générée. Tout d'abord, créons un fichier contenant notre message.

Nous utiliserons la commande echo pour créer un fichier nommé message.txt. L'option -n est importante car elle empêche echo d'ajouter un caractère de nouvelle ligne à la fin de la chaîne, ce qui modifierait le contenu et donc le HMAC final.

echo -n "This is a secret message." > message.txt

Maintenant, avec le message et la clé, nous pouvons calculer le HMAC. Nous utiliserons la commande openssl dgst, qui sert à calculer les digests de messages (hachages).

  • -sha256: Spécifie que nous souhaitons utiliser l'algorithme de hachage SHA-256.
  • -mac hmac: Spécifie que nous souhaitons calculer un Code d'Authentification de Message (Message Authentication Code, MAC) en utilisant la méthode HMAC.
  • -macopt hexkey:$HMAC_KEY: Ceci fournit les options pour l'algorithme MAC. Ici, nous spécifions que notre clé est au format hexadécimal (hexkey) et nous passons la clé elle-même en utilisant la variable d'environnement $HMAC_KEY que nous avons créée précédemment.
  • message.txt: Le fichier d'entrée contenant les données à authentifier.

Exécutez la commande suivante pour générer le HMAC :

openssl dgst -sha256 -mac hmac -macopt hexkey:$HMAC_KEY message.txt

Le résultat sera le digest HMAC de votre message, calculé avec votre clé secrète. Le format de sortie affichera l'algorithme utilisé et la valeur HMAC résultante.

HMAC-SHA2-256(message.txt)= 214fbb56f716dfe1c2f4a60615a5b901b263fd74c9678b2aef4f01779b34dea8

Cette valeur HMAC est ce que vous enverriez avec votre message à un destinataire qui possède également la clé secrète.

Vérifier l'Intégrité HMAC

Dans cette étape, vous allez observer le processus de vérification du HMAC en action. Vous verrez comment l'utilisation de la clé correcte réussit, tandis que l'utilisation d'une clé incorrecte ou d'un message modifié entraîne un échec.

Vérification avec la Clé Correcte

La vérification n'est pas une commande spéciale ; c'est simplement l'acte pour le destinataire de recalculer le HMAC par lui-même et de le comparer à celui qu'il a reçu. Si vous exécutez à nouveau la commande de l'étape précédente, vous obtiendrez exactement la même valeur HMAC. Cela confirme que tant que la clé et le message restent inchangés, le HMAC est cohérent.

Observer l'Échec avec une Clé Incorrecte

Maintenant, simulons un attaquant ou une configuration incorrecte en essayant de vérifier le message avec une clé différente. Premièrement, générons une nouvelle clé, dite "incorrecte" :

export WRONG_KEY=$(openssl rand -hex 32)

Essayez maintenant de calculer le HMAC pour le message.txt original, mais en utilisant cette $WRONG_KEY :

openssl dgst -sha256 -mac hmac -macopt hexkey:$WRONG_KEY message.txt

Vous verrez une nouvelle valeur HMAC dans la sortie :

HMAC-SHA2-256(message.txt)= 781729497e89f3f9cb1d8c7ab632e22753062ac39cd64de0e5b81a45de245d78

Remarquez que ce HMAC est complètement différent de celui que vous avez généré avec la $HMAC_KEY correcte. Cela démontre qu'en l'absence de la clé secrète correcte, il est impossible de produire un HMAC valide pour le message, assurant ainsi l'authenticité.

Observer l'Échec avec un Message Modifié

Voyons également ce qui se passe si le message lui-même est falsifié. Nous allons modifier légèrement message.txt :

echo -n "This is a tampered message." > message.txt

Calculez maintenant le HMAC à nouveau en utilisant la clé originale et correcte ($HMAC_KEY) :

openssl dgst -sha256 -mac hmac -macopt hexkey:$HMAC_KEY message.txt

Encore une fois, vous obtiendrez une valeur HMAC complètement différente. Cela prouve que toute modification apportée au message, aussi minime soit-elle, sera détectée, assurant ainsi l'intégrité.

Implémenter HMAC en Python

Dans cette étape, vous apprendrez à effectuer des opérations HMAC par programmation en utilisant Python. Ceci est une exigence courante dans les applications web, les API et autres logiciels qui doivent garantir la sécurité des messages. La bibliothèque standard de Python fournit les modules hmac et hashlib à cette fin.

Nous allons écrire un script Python simple pour calculer le HMAC-SHA256 d'un message. Tout d'abord, ouvrez le fichier hmac_example.py en utilisant l'éditeur de texte nano :

nano hmac_example.py

Maintenant, copiez et collez le code Python suivant dans l'éditeur nano. Ce code importe les bibliothèques nécessaires, définit une clé et un message, puis calcule et affiche le HMAC.

Note : Pour cet exemple, nous codons en dur la clé et le message. Dans une application réelle, la clé serait stockée et gérée de manière sécurisée. La clé et le message doivent tous deux être des chaînes d'octets (byte strings), nous les préfixons donc par b.

import hmac
import hashlib

## La clé secrète (doit être des octets)
## Dans une vraie application, récupérez-la depuis un emplacement sécurisé
key = b'\x0d\xb3\x48\xc7\x84\x73\xce\x84\x60\x41\x6f\x87\x5c\xd8\x72\x39\xd0\xf5\xf6\x6f\xbe\x51\x03\xba\x4b\x5c\x84\xcf\x2c\xd7\x69\x14'

## Le message à authentifier (doit être des octets)
message = b'This is a secret message.'

## 1. Créer un nouvel objet HMAC
##    - Passer la clé
##    - Passer le message
##    - Spécifier l'algorithme de hachage (depuis hashlib)
h = hmac.new(key, message, hashlib.sha256)

## 2. Obtenir le digest au format hexadécimal
hex_digest = h.hexdigest()

print("HMAC Digest:")
print(hex_digest)

Après avoir collé le code, enregistrez le fichier et quittez nano en appuyant sur Ctrl+O, puis Enter pour confirmer le nom du fichier, et enfin Ctrl+X pour quitter.

Exécutez maintenant votre script Python depuis le terminal :

python3 hmac_example.py

Le script s'exécutera et affichera le digest HMAC calculé.

HMAC Digest:
214fbb56f716dfe1c2f4a60615a5b901b263fd74c9678b2aef4f01779b34dea8

Vous avez maintenant implémenté avec succès la génération de HMAC en Python, une compétence directement applicable à la construction de logiciels sécurisés.

Résumé

Dans ce laboratoire, vous avez acquis une expérience pratique avec les Codes d'Authentification de Message Basés sur des Fonctions de Hachage (HMAC - Hash-based Message Authentication Codes), une pierre angulaire de la cryptographie moderne pour garantir l'intégrité et l'authenticité des données.

Vous avez appris que :

  • Le HMAC combine une fonction de hachage cryptographique avec une clé secrète pour créer un code d'authentification de message.
  • Seules les parties possédant la clé secrète peuvent générer ou vérifier le HMAC, empêchant ainsi la modification non autorisée et la falsification.
  • L'outil en ligne de commande openssl est un utilitaire puissant pour effectuer des opérations cryptographiques, y compris la génération de clés aléatoires (openssl rand) et le calcul des HMAC (openssl dgst).
  • Tout changement apporté au message ou l'utilisation d'une clé incorrecte entraînera un HMAC complètement différent, rendant la falsification facilement détectable.
  • Python fournit les bibliothèques hmac et hashlib pour intégrer facilement la fonctionnalité HMAC dans vos applications.

En maîtrisant le HMAC, vous avez franchi une étape importante vers la construction de systèmes plus sécurisés et dignes de confiance.