Sécuriser ses échanges en NFC

Nous avons vu dans les précédent articles ce qu’était le NFC et la norme principale ISO/IEC 14443. Je fais une petite pause dans les normes pour aborder un sujet majeur de la communication NFC, la sécurité !!

Trop souvent, l’usage d’étiquettes NFC ou la lecture de l’ID de la carte fait oublier ce sujet. On tombe après sur des articles « choc » : « Le NFC est moins sécurisé que …. » ou alors « Une faille critique découverte sur les objets connectés en NFC …« , et c’est encore ce qui m’est arrivé ce weekend. Mais évidemment, si personne ne chiffre ses communications on ne peut pas s’attendre à des miracles…

La norme ISO/IEC 7816-4 décrit un mode d’authentification basé sur les clefs symétriques (« Three Pass Authentication »). Ce processus assez simple à mettre en oeuvre peut servir à chiffrer les informations échangées durant la session.

« Three Pass Authentication », la fameuse « passe triple divergente » ?

On parle de « Three Pass » parce que l’authentification est réalisée avec trois échanges d’informations. Cette technique permet de vérifier que tout le monde a la même clef sans jamais se l’échanger.

En résumé : « Je sais que tu sais que je sais que tu as la même clef que moi ».

Le concept est assez simple puisqu’il s’agit d’échanger un message chiffré entre le PCD et la PICC. On s’assure qu’en connaissant le message d’origine et en déchiffrant le message reçu avec la clef on retrouve bien le message d’origine.

J’ai publié un projet sur GitHub pour illustrer ce fonctionnement (il y a aussi un chiffrement RSA mais ce n’est pas ce qui nous intéresse dans cet article). Vous pouvez presque l’utiliser tel quel. Il s’agit simplement d’un client et d’un serveur TCP qui communiquent après s’être authentifié avec la méthode expliquée dans cet article. A noter que le PCD est le client et la PICC le serveur.

Etapes

Voici la liste des étapes lors de l’authentification.

Etape Description Echanges

1

Le PCD demande à la PICC de générer un « challenge ».

La PICC génère une suite d’octets aléatoire et la retourne au PCD.

2

Le PCD, lorsqu’il reçoit ce « challenge » génère à son tour une suite d’octet aléatoire, il concatène ces deux suites et chiffre l’ensemble avec la clef et l’algorithme qu’il souhaite utiliser. La chaîne obtenue, l’index et l’algorithme de la clef à utiliser sont envoyés à la PICC.

La PICC, à la réception de ces informations déchiffre avec sa propre clef, et compare le résultat avec la valeur générée en étape 1. Si cela correspond on est donc certain que le PCD à la même clef que la PICC.

3

Le PCD génère un challenge et l’envoi à la PICC accompagné de l’index et de l’algorithme de la clef qu’il souhaite utiliser.

La PICC génère à son tour une suite d’octet aléatoire, elle concatène ces deux suites et chiffre l’ensemble avec la clef et l’algorithme demandés. La chaîne obtenue est retournée au PCD.

4

Le PCD, à la réception de ces informations, déchiffre avec sa propre clef et compare le résultat avec la valeur générée en étape 3. Si cela correspond on est donc certain que la PICC à la même clef que le PCD.

 

5

La clef de session est construite avec les challenges générés par le PCD (étape 2) et la PICC (étape 3). C’est cette clef de session qui est utilisée pour chiffrer et déchiffrer les informations échangées par la suite.

 

Exemples

Maintenant que l’on connait les étapes, voici une transcription des échanges.

La clef a utiliser possède l’index « 1 » et vaut « 00 01 02 03 04 05 06 07 08 09 AA BB CC DD EE FF ».
L’algorithme est « AES-128 ».

Echange pour une authentification réussie

Le PCD et la PICC ont bien la même clef.

Échange pour une authentification refusée (coté PICC)

Le PCD n’utilise pas la bonne clef ou ne la connaît pas.

Echange pour une authentification refusée (coté PCD)

Dans ce cas de figure la PICC ne connaît pas la clef, elle simule le succès de la première passe.

Le reste des échanges

Une fois le client et le serveur authentifiés, les échanges sont chiffrés avec la clef de session qui est générée. A noter un point crucial, on ne réinitialise pas le processus de chiffrement à chaque fois. En effet, le vecteur d’initialisation doit être conservé d’un chiffrage à l’autre (contrairement à la phase d’authentification). La norme décrit les événements qui doivent remettre à zéro le vecteur d’initialisation.

Conclusion

Ce mode d’authentification est relativement simple à mettre en oeuvre et offre déjà un bon niveau de sécurité dans vos échanges. Lorsque l’on déploie des services P2P sur Smartphone la mise en place de ce système permet de garantir que les échanges ne circulent pas en clair et que les deux communicants se « connaissent ». Il est tout à fait possible de l’implémenter dans une communication avec un objet connecté, en NFC ou autre. Veillez seulement à bien protéger vos clefs symétriques…

Mais au final, peu importe le comment, si les données échangées sont privées, sensibles, critiques ou que vous ne souhaitez simplement pas que n’importe qui puisse les lire, chiffrer les, même avec le plus basique des algorithmes.