Avertissement : Cet article a été traduit de l’anglais par un LLM. La précision n’est pas garantie. Vous pouvez lire l’article original en anglais.
J’utilise des Yubikeys pour la 2FA depuis un bon moment, mais je n’avais jamais pris le temps de regarder comment elles fonctionnent au niveau du protocole. C’est ce que nous allons aborder dans cet article.
Si vous n’êtes pas familier avec FIDO U2F, il s’agit d’un standard d’authentification qui permet aux clés de sécurité physiques « d’agir comme un second facteur pour renforcer les flux de connexion existants basés sur nom d’utilisateur/mot de passe ». En termes simples, cela nécessite d’avoir une clé de sécurité branchée sur votre ordinateur, et optionnellement de la toucher pour autoriser une connexion après avoir entré votre mot de passe (des versions NFC existent également).
Notez que par souci de brièveté et de clarté, j’ai simplifié certaines choses (par exemple, je n’explique pas le rôle du navigateur dans les différentes interactions). Si vous souhaitez en savoir plus sur les détails, Yubico dispose d’une page de documentation très complète.
Enregistrement de l’appareil#
La première étape pour pouvoir utiliser votre clé comme 2FA avec un site web est de l’enregistrer. La figure suivante montre comment cela se fait.

En résumé, le token U2F génère une paire de clés (ECC). Il utilise ensuite sa clé maîtresse — qui ne quitte jamais l’appareil — pour chiffrer la clé privée + l’App ID, et les envoie avec la clé publique au site web.
Bien qu’envoyer une clé privée (même chiffrée) puisse sembler un peu étrange, cela permet à la clé de sécurité de ne pas dépendre du stockage local, et elle peut donc être utilisée pour un nombre illimité de sites web.
Le schéma montre simplement l’App ID par simplification, mais vous devez comprendre cet App ID comme quelque chose comme l’URL du site web/la source des requêtes vers la clé U2F.
Authentification#
Maintenant que notre clé est configurée, nous pouvons l’utiliser comme dispositif d’authentification 2FA lors de la connexion au site web. Ce qui se passe alors est illustré dans la figure suivante.

En résumé, le flux est le suivant lorsque la clé de sécurité est utilisée :
- La clé U2F prend le key handle (généré lors de la phase d’enregistrement) et le déchiffre avec sa clé maîtresse pour obtenir la clé privée et l’app ID. Ce processus permet également de vérifier que ce site web a bien été enregistré
- La clé U2F possède un compteur local qui est incrémenté à chaque authentification avec un site web. Cela permet de prévenir les attaques par rejeu : le site web stockera le compteur actuel à chaque authentification et rejettera toute réponse avec un compteur inférieur
- Lors de l’authentification, le client vérifiera également que l’App ID correspond à l’adresse du site web auquel il est actuellement connecté. Ceci est fait pour éviter le phishing : si un tiers essaie d’intercepter les messages, l’origine de la requête d’authentification sera différente, et donc l’authentification n’aboutira pas
- Comme vous vous en souvenez de la partie précédente, le site web stocke la clé publique ECC générée par le token U2F lors de la phase d’enregistrement. La clé U2F utilisera la clé privée ECC récupérée du handle pour signer les données de challenge (aléatoires) et quelques autres champs, et le site web pourra valider grâce à la clé publique que les données ont bien été signées par le bon appareil
Conclusion#
Vous devriez maintenant avoir une bonne compréhension du fonctionnement des clés de sécurité U2F. Notez que l’implémentation de telles clés peut différer d’un fabricant à l’autre. Par exemple :
- Il pourrait y avoir un compteur pour chaque service avec lequel la clé s’authentifie plutôt qu’un compteur global
- Le handle ne doit pas nécessairement contenir la clé privée ECC. Le token pourrait très bien envoyer un identifiant unique au service, et stocker localement quelle clé privée ECC est associée à quel service
Sources#
- How FIDO U2F Works (Yubico)
- Key Generation (Yubico)
- U2F Specs (FIDO Alliance)
Crédits#
- Photo de couverture par regularguy.eth sur Unsplash