Outil de navigateur
Sortez vos clés secrètes de Google Authenticator.
Google Authenticator vous montre un QR code contenant tous les comptes de votre téléphone, puis ne vous donne aucun moyen de le lire. Prenez une capture d'écran de ce code, déposez-la ici, et vous obtenez la clé secrète en base32 et le lien otpauth de chacun.
L'image ne quitte jamais cet onglet. La lecture du QR code, son analyse et la génération des codes se font toutes dans votre navigateur, et vous pouvez le prouver en coupant votre réseau et en utilisant l'outil quand même.
L'outil
Déposez une capture d'écran du code d'exportation
Ou collez-en une, choisissez un fichier, ou pointez votre appareil photo sur le téléphone.
Le décodage se fait sur votre machine, dans cet onglet, et c'est pour cela que sans JavaScript, il n'a pas lieu du tout. Il n'y a ici aucun serveur qui pourrait le faire à la place. Tout ce qui suit explique le format et ce que l'outil en fait, et le code est publié si vous préférez l'exécuter vous-même.
Avant de commencer
Traitez ce code d'exportation comme un mot de passe.
Ce n'est pas un avertissement pour la forme. Un QR code d'exportation est un objet plus dangereux que la plupart des gens ne le supposent, de trois façons précises qu'il vaut mieux connaître avant d'en créer un.
Il contient toutes les clés, pas une image de vos codes
Le code contient la clé secrète brute de chaque compte qui s'y trouve. Quiconque possède l'image peut générer indéfiniment des codes valides pour ces comptes, depuis n'importe quel appareil, sans votre téléphone et sans que vous le remarquiez.
Changer votre mot de passe ne le révoque pas
Ni un nouveau mot de passe, ni un nouveau téléphone, ni la suppression de l'application n'invalident une clé secrète exportée. La seule chose qui le fasse, c'est de désactiver puis de réactiver l'authentification à deux facteurs chez chaque service, ce qui émet une nouvelle clé et met l'ancienne hors service.
La capture d'écran survit au moment
Une capture d'écran arrive dans votre pellicule, et de là dans la sauvegarde de photos que vous utilisez. Quelqu'un qui la trouve dans un an dispose exactement de l'accès que vous aviez. Faites cela sur un appareil auquel vous faites confiance, et supprimez l'image ensuite, y compris de l'album des éléments récemment supprimés.
Ce que vous récupérez
Chaque champ, et d'où il vient.
L'intérêt de faire cela correctement, c'est que vous pouvez distinguer une donnée décodée d'une valeur par défaut raisonnable. Les deux sont affichées, et elles sont étiquetées différemment.
La clé secrète
Du base32 RFC 4648, en majuscules et sans remplissage, exactement comme une application d'authentification l'affiche. Seize caractères pour une clé de dix octets, trente-deux pour une clé de vingt octets. C'est là tout le secret d'authentification. Tout le reste n'en est que des métadonnées.
Émetteur et compte
Le service, et le compte auquel la clé appartient. Google place parfois l'émetteur dans son propre champ, et le replie parfois dans l'étiquette du compte sous la forme « émetteur:compte », les deux sont donc lus et les deux sont affichés, séparément.
Algorithme, chiffres et type
Presque toujours SHA-1, six chiffres et basé sur le temps, parce que c'est ce que les services déploient réellement. Quand l'exportation laisse l'un de ces champs vide, la valeur par défaut habituelle est utilisée et le champ est signalé comme valeur par défaut plutôt que comme donnée.
Le lien otpauth
Une URI otpauth:// standard, reconstruite à partir des champs ci-dessus plutôt que décodée, elle correspond donc exactement à ce qu'attend une autre application d'authentification. Chacune reçoit aussi un QR code, prêt à être scanné directement dans une autre application.
La période, étiquetée honnêtement
Chaque compte indique trente secondes, et cette valeur ne provient d'aucune donnée décodée. Le format d'exportation a des champs pour la clé secrète, le nom, l'émetteur, l'algorithme, le nombre de chiffres, le type et le compteur, et pas le moindre champ pour la période. Google Authenticator utilise trente secondes pour tout ce qu'il exporte, c'est donc ce qui est indiqué, signalé comme valeur par défaut pour qu'elle ne soit jamais prise pour une donnée présente dans le code.
Les comptes basés sur un compteur
Quelques comptes sont basés sur un compteur plutôt que sur le temps, leur code ne se renouvelle donc pas. Le compteur est affiché tel qu'il a été exporté. Maniez-les avec soin : utiliser un code fait avancer le compteur chez le service, et une copie qui a pris du retard cesse de fonctionner.
Comment ça marche
Ce sont cinq décodages, l'un après l'autre.
Rien de tout cela n'est de la cryptographie et rien n'a besoin d'un serveur. La chaîne est assez courte pour être décrite en entier, ce qui vaut la peine, parce que l'explication habituelle tient en « installez ces trois programmes ».
L'outil met en œuvre les cinq lui-même, sans code tiers. La lecture du QR code est de loin la plus grosse partie, parce que le navigateur ne la fera pas pour vous : le détecteur de codes-barres intégré est absent de Safari et de Firefox, le décodeur est donc écrit à partir de la spécification.
01
Lire le QR code
L'image est réduite en noir et blanc, les trois motifs de repérage des coins sont localisés, une grille est ajustée à travers eux (en perspective, si la photo a été prise de biais), chaque module est échantillonné, et la correction d'erreurs Reed-Solomon répare ce que l'appareil photo a mal capté. En sort une chaîne commençant par otpauth-migration://offline?data=.
02
Décoder le paramètre data
Le décodage des séquences en pourcentage de ce paramètre donne du base64 standard, qui se décode en quelques dizaines d'octets. Un piège mérite d'être nommé : il ne faut pas le lire avec un analyseur de requête d'URL, parce que ceux-ci appliquent le décodage de formulaire et transforment un signe plus en espace, alors que le base64 standard utilise des signes plus.
03
Analyser le protocol buffer
Ces octets forment un message protobuf non documenté contenant un enregistrement de compte répété, une version, une taille de lot, un index de lot et un identifiant de lot. Chaque enregistrement de compte a sept champs : la clé secrète brute, le nom, l'émetteur, et des nombres représentant l'algorithme, le nombre de chiffres, le type et le compteur.
04
Réencoder la clé secrète en base32
La clé secrète arrive sous forme d'octets bruts. Les applications d'authentification l'affichent en base32, les octets sont donc réencodés pour produire la chaîne que vous taperiez à la main dans une autre application.
05
Générer un code pour vérifier
Un code basé sur le temps est un HMAC de l'intervalle de trente secondes en cours sous cette clé, tronqué à six chiffres. Ce sont les fonctions cryptographiques du navigateur qui calculent le HMAC, il n'y a donc nulle part ici de cryptographie faite maison. Si le code correspond à ce qu'affiche votre téléphone, l'extraction est correcte, et c'est la seule vérification qui compte vraiment.
Confidentialité
L'affirmation est limitée, et vous pouvez la tester.
Une affirmation de confidentialité que vous ne pouvez pas vérifier est du marketing. Voici donc l'affirmation précise, et ce que vous pouvez faire en dix secondes pour la vérifier.
Votre image et vos clés secrètes ne sont jamais transmises
L'image que vous déposez, la charge utile décodée, les clés secrètes et les codes générés restent dans cet onglet. Le code qui les manipule ne contient aucun appel à fetch, XMLHttpRequest, WebSocket, EventSource ni sendBeacon, et la version hors ligne ajoute une politique de sécurité du contenu pour que le navigateur applique cette règle au lieu de croire le code sur parole.
Le test qui vaut la peine d'être fait soi-même
Coupez votre réseau, rechargez cette page depuis le cache ou ouvrez la version en fichier unique que vous avez téléchargée, et utilisez l'outil quand même. Il fonctionne. Rien qui aurait besoin d'un serveur ne fonctionnerait.
Ce que cette page charge elle-même
Soyons exacts, parce que l'affirmation plus large serait fausse : cette page charge un petit script d'analytics que nous hébergeons nous-mêmes et qui enregistre l'adresse de la page, rien d'autre. Il n'approche pas l'outil et ne peut pas voir ce que vous extrayez. Si cela vous dérange quand même, la version hors ligne n'a aucune référence externe d'aucune sorte.
Rien n'est enregistré
Pas de cookies, pas de stockage local, pas de stockage de session, pas de base de données, pas de cache. Recharger la page fait perdre tout ce que vous aviez extrait, ce qui est gênant une fois et correct toujours.
Ce que l'effacement fait vraiment
L'effacement écrase les octets des clés secrètes avec des zéros. Cela vaut la peine d'être fait, et ce n'est pas un nettoyage de la mémoire : en JavaScript, les chaînes ne peuvent pas être écrasées, et le moteur peut conserver des copies que ni nous ni vous ne pouvons atteindre. C'est la fermeture de l'onglet qui achève le travail, et aucune page ne peut honnêtement prétendre à plus.
Publié, et assez petit pour être lu
L'ensemble tient dans un seul paquet sous licence MIT, sans dépendance d'exécution, il n'y a donc aucune chaîne d'approvisionnement à auditer derrière lui. Le décodeur QR, le lecteur protobuf, les codecs base32 et base64 et les fonctions de mot de passe à usage unique y sont tous, et ses tests s'appuient sur des vecteurs de test publiés plutôt que sur lui-même.
Obtenir le code
Où se cache le code d'exportation.
Cela ne s'appelle ni clé d'exportation ni sauvegarde, et ce n'est pas dans les paramètres. Google le classe sous le changement de téléphone, et c'est pour cela que la plupart des gens ne le trouvent jamais.
- 01Ouvrez Google Authenticator sur le téléphone qui contient les comptes.
- 02Ouvrez le menu, puis choisissez Transférer des comptes.
- 03Choisissez Exporter des comptes, et authentifiez-vous quand l'application le demande.
- 04Cochez les comptes que vous voulez et continuez. Un QR code apparaît.
- 05Prenez une capture d'écran de ce code, ou pointez l'appareil photo de cet outil sur le téléphone.
Si vous obtenez plus d'un code
Google répartit une longue liste sur plusieurs QR codes et vous indique où vous en êtes. Capturez-les tous et ajoutez-les l'un après l'autre. Ils partagent un identifiant et chacun porte son propre index, ils se recombinent donc dans n'importe quel ordre et l'outil indique quelles parties manquent encore. Les codes provenant de deux exportations différentes sont refusés plutôt que combinés, parce que des comptes qui se chevauchent entre deux exportations distinctes produiraient une liste qui n'a jamais existé sur votre téléphone.
Une capture d'écran plutôt qu'une photo
Une capture d'écran se décode du premier coup. La photo d'un écran ajoute des reflets, du moiré et de la perspective, que le décodeur gère tous mais dont il n'a aucun besoin. Si vous photographiez le téléphone de quelqu'un d'autre, remplissez le cadre avec le code et tenez-le bien en face.
Ensuite
Que faire d'une clé secrète une fois que vous l'avez.
La transférer dans une autre application
Chaque compte reçoit ici son propre QR code, dans le format que toutes les applications d'authentification lisent, vous pouvez donc le scanner directement dans une autre application. Taper la clé base32 à la main fonctionne aussi, et cela vaut la peine si vous voulez être certain que rien n'a été mal scanné.
Comparer un code avec le téléphone
Avant de vous fier à tout cela, comparez un code généré avec ce que Google Authenticator affiche pour le même compte au même moment. S'ils correspondent, la clé est bonne. Sinon, la clé est mauvaise et le reste du résultat n'a aucune importance.
La conserver comme un mot de passe
Une clé secrète a sa place dans un gestionnaire de mots de passe, dans l'entrée de ce compte, pas dans une note ou un tableur. Certains gestionnaires généreront les codes pour vous si vous y collez le lien otpauth. À réfléchir d'abord : un gestionnaire qui détient à la fois le mot de passe et le second facteur constitue un point de défaillance unique, ce qui peut être ou non le compromis que vous voulez.
Supprimer la capture
Y compris de l'album des éléments récemment supprimés, et avant que votre photothèque ne la synchronise quelque part. Effacez ensuite l'outil et fermez l'onglet.
Détail
Les détails concrets.
Ce que l'outil fait et ne fait pas, sans le marketing. Chaque ligne ici est vérifiée par les tests du paquet lui-même.
- Exécution
- Entièrement dans votre navigateur. Pas de serveur, pas de compte, rien à installer.
- Lecture
- Les codes d'exportation de Google Authenticator (otpauth-migration), et les codes otpauth à un seul compte
- Saisie
- Glisser-déposer, coller, sélecteur de fichier, ou l'appareil photo de l'appareil
- Sortie
- Clé secrète en base32, émetteur, nom du compte, algorithme, chiffres, type, compteur, lien otpauth, un QR code d'importation et un code en direct
- Réseau
- Aucun. Ni fetch, ni XMLHttpRequest, ni WebSocket, ni EventSource, ni sendBeacon, nulle part dans l'outil.
- Stockage
- Aucun. Pas de cookies, de stockage local, de stockage de session, de base de données ni de cache.
- Hors ligne
- Oui. Une version en fichier unique fonctionne depuis votre propre disque, réseau coupé.
- Navigateurs
- Chrome, Edge, Firefox, et Safari 16 ou plus récent. L'appareil photo exige une page sécurisée, il peut donc ne pas s'ouvrir depuis un fichier local.
- Dépendances
- Aucune à l'exécution. Le codec QR, le lecteur protobuf, les codecs base32 et base64 et les fonctions de mot de passe à usage unique sont tous dans le paquet.
- Licence
- MIT
Les questions qui valent la peine d'être posées.
- Est-il prudent de mettre mon code d'exportation dans un site web ?
- La réponse honnête, c'est que vous ne devriez pas mettre un secret d'authentification dans une page que vous ne pouvez pas vérifier, et c'est pour cela que celle-ci est vérifiable. Rien n'est transmis, le code est publié, et il existe une version en fichier unique que vous pouvez télécharger et exécuter réseau coupé. Si vous préférez ne faire confiance à aucune page, utilisez celle-là.
- Est-ce que quelque chose est envoyé à vos serveurs ?
- Non, et il n'y a rien de notre côté qui pourrait le recevoir. Le décodage, l'analyse et la génération des codes se font tous dans votre navigateur. Ouvrez le panneau réseau de votre navigateur, extrayez un code, et vous ne verrez aucune requête.
- Puis-je l'utiliser sans connexion internet ?
- Oui. Téléchargez le fichier HTML unique depuis la page des versions du dépôt et ouvrez-le. Il n'a aucune référence externe d'aucune sorte, et une politique de sécurité du contenu qui interdit purement et simplement les connexions. Tout fonctionne sauf l'appareil photo, que certains navigateurs refusent à une page ouverte depuis un fichier ; déposer ou coller une capture d'écran fonctionne toujours.
- Si quelqu'un obtient mon code d'exportation, comment le révoquer ?
- On ne peut pas révoquer une clé secrète isolément. Désactivez l'authentification à deux facteurs chez le service concerné et reconfigurez-la, ce qui émet une nouvelle clé et rend l'ancienne inutile. Changer votre mot de passe ne fait pas cela, et supprimer l'application ou réinitialiser le téléphone non plus.
- Google m'a donné plusieurs QR codes. Et maintenant ?
- Capturez-les tous et ajoutez-les un par un. Ils partagent un identifiant de lot et chacun porte son propre index, ils se recombinent donc dans n'importe quel ordre et l'outil vous dit quelles parties manquent encore. Rajouter un code que vous avez déjà est sans conséquence. Les codes provenant de deux exportations différentes sont refusés plutôt que fusionnés, parce que la liste combinée n'aurait jamais existé sur votre téléphone.
- Pourquoi chaque compte indique-t-il trente secondes ?
- Parce que le format d'exportation n'a pas de champ pour la période, et que Google Authenticator utilise trente secondes pour tout. La valeur est juste et elle ne provient d'aucune donnée décodée, c'est pourquoi elle est étiquetée comme valeur par défaut plutôt qu'affichée comme donnée. Si un service utilisait un autre intervalle, une exportation depuis cette application ne vous le dirait pas.
- Un de mes comptes n'a pas de code qui change.
- C'est un compte basé sur un compteur, et son code n'est pas censé se renouveler. Son compteur est affiché tel qu'il a été exporté. Faites-y attention : utiliser un code fait avancer le compteur chez le service, et une copie qui a pris du retard n'est plus acceptée.
- Quels algorithmes sont pris en charge ?
- SHA-1, SHA-256 et SHA-512, avec les fonctions cryptographiques du navigateur. MD5 figure dans la liste des algorithmes du format, mais les navigateurs ne savent pas le calculer, aucun code n'est donc généré dans ce cas ; la clé secrète et tous les autres paramètres sont malgré tout renvoyés correctement. En pratique, les services utilisent SHA-1 avec six chiffres, et Google Authenticator ignore le reste de toute façon.
- L'appareil photo ne fonctionne pas.
- Il exige une page sécurisée, il ne s'ouvrira donc pas en http simple et peut ne pas s'ouvrir depuis une adresse de fichier. Un refus est souvent mémorisé, vérifiez donc les paramètres de site dans votre navigateur. Quoi que fasse l'appareil photo, déposer ou coller une capture d'écran fonctionne partout.
- Il n'ouvre pas ma photo iPhone.
- Les photos iPhone sont en HEIC, et aucun navigateur à part Safari ne sait décoder ce format. Prenez une capture d'écran plutôt qu'une photo, ou convertissez le fichier en PNG ou en JPEG. Une capture d'écran est de toute façon la meilleure entrée, parce qu'elle ne contient ni reflet ni perspective.
- Puis-je transférer ces comptes dans une autre application d'authentification ?
- Oui. Chaque compte a son propre QR code au format otpauth standard, que toutes les applications d'authentification lisent, et vous pouvez aussi taper la clé base32 à la main. Comparez un code généré avec votre téléphone avant d'en supprimer quoi que ce soit.
- J'ai déjà vu faire cela avec zbarimg et un programme Go.
- Ce sont les trois mêmes décodages, précédés de trois installations : lire le QR code, décoder en base64 le paramètre data, analyser le protobuf. Cet outil fait tout cela dans une page, et le paquet qui est derrière est publié si vous préférez le scripter. Rien ici n'encapsule ces outils ; le décodeur QR et le lecteur protobuf sont écrits à partir de leurs spécifications.
À vous de le garder, et à vous de le vérifier.
Un seul paquet sous licence MIT, sans dépendance d'exécution. Lisez-le, forkez-le, exécutez-le hors ligne, ou utilisez-le simplement ici.
Lire le code source