Nous sommes sur Product Hunt aujourd'hui ! Laisser un commentaire
Authenticator 1.16.0 est disponible. Voir les nouveautés
Un aperçu technique destiné aux auditeurs de sécurité. Tout ici est vérifiable dans le code source — y compris ce qui nous met le moins en valeur, que nous énonçons plutôt que d'omettre.
L'extension est une extension Chrome Manifest V3 qui génère les codes TOTP localement avec OTPAuth. La génération des codes, le stockage des comptes et leur chiffrement ne font appel à aucun backend, et il n'existe pas de comptes utilisateur. Nous exploitons un seul serveur, api.authenticator.sh, pour l'offre gratuite et Pro — décrit plus bas —, et il ne reçoit jamais ni secret, ni nom de compte, ni émetteur, ni code.
Ce serveur ne détient aucun matériel de clé pour les comptes de qui que ce soit : pas de séquestre de clé et aucun chemin de récupération sous notre contrôle. Si un utilisateur oublie son mot de passe et perd son code de récupération, nous ne pouvons rien pour lui — c'est voulu.
La protection par mot de passe est facultative et désactivée par défaut. Lorsqu'elle est active :
Les données ne sont jamais chiffrées directement avec une clé dérivée du mot de passe. Une clé maîtresse aléatoire chiffre les enregistrements ; la sortie de PBKDF2 ne fait qu'envelopper cette clé maîtresse. Deux conséquences en découlent, et toutes deux comptent :
Avec la protection par mot de passe activée, tout l'enregistrement du compte est chiffré, hormis son identifiant et son empreinte — y compris le nom du service, si bien qu'un profil volé ne révèle pas auprès de quels services l'utilisateur a des comptes. L'activation chiffre les enregistrements, les vérifie en les déchiffrant et en les comparant, et seulement ensuite supprime toute copie en clair : stockage local du navigateur, synchronisation et les sept instantanés de sauvegarde en rotation.
Dit clairement, parce que cela compte pour votre évaluation :
En résumé : cela protège les données au repos. Cela ne défend pas, et ne peut pas défendre, un appareil déjà sous le contrôle d'un attaquant pendant son utilisation.
Le manifeste déclare cinq permissions et aucune permission d'hôte :
Il n'y a aucun script de contenu, aucune permission tabs, cookies ou webRequest, et aucune web-accessible resource. Rien de chez nous n'existe dans une page tant que vous n'y demandez pas un code ; ce qui s'exécute alors est injecté pour cet onglet-là et cette invocation-là, sous l'autorisation que votre propre clic accorde, et ne laisse rien derrière.
Le scan de QR code par la caméra s'exécute sur une page d'extension ouverte dans un onglet, pas dans la popup — une popup est détruite dès qu'elle perd le focus, ce que fait précisément une demande de permission. Cela ne nécessite aucune permission dans le manifeste : c'est la demande d'accès caméra standard du navigateur, accordée par origine d'extension et révocable dans les paramètres du site, et elle n'apparaît jamais avant que l'utilisateur n'ouvre le scanner. La vidéo est décodée localement, jamais transmise ni stockée.
Depuis la 1.14.0, l'extension contacte api.authenticator.sh une fois par jour — au démarrage du navigateur, ou une fois la popup affichée, jamais sur le chemin critique de l'affichage d'un code. La requête est une liste fermée de champs, construite par une seule fonction dans src/billing/sync.ts et tenue à cette liste par un test :
Jamais envoyés : les secrets, les noms de comptes, les émetteurs, les codes, ni les sites où ils servent. Le serveur déduit le pays de la requête, en bordure de son réseau, et ne conserve pas l'adresse IP. La page de désinstallation reçoit le même identifiant d'installation sous la forme ?i= : elle signale au serveur que l'installation a été supprimée et y rattache une réponse facultative au questionnaire.
Conservés à cette fin dans chrome.storage.local : l'identifiant d'installation, la dernière politique et la dernière licence signées, la clé de licence que détient cette installation (saisie, ou reçue après un achat fait depuis elle), le nombre d'ouvertures par jour jusqu'à ce que le serveur l'ait reçu, et les événements en attente — aucune donnée de compte. Lorsque la synchronisation est active, le fait que l'installation soit antérieure à la facturation et cette clé de licence passent aussi par Chrome Sync, pour que les autres profils Chrome de l'utilisateur les récupèrent et activent Pro d'eux-mêmes ; désactiver la synchronisation les retire tous deux de Chrome Sync, la réactiver les y remet.
Ce qui revient, et comment l'extension le traite :
La limite n'est pas un DRM : le code est open source, et un fork peut la retirer. Ce qui ne doit jamais être possible, c'est qu'une personne obtienne ou utilise la licence d'une autre, ou qu'elle rende limitée l'installation de quelqu'un d'autre — ce serait une vulnérabilité, qui entre dans le périmètre de notre politique de sécurité.
L'extension émet d'elle-même deux types de requêtes : la vérification de l'horloge et l'appel de facturation quotidien. Tout le reste ci-dessous se produit parce que l'utilisateur a cliqué. Manifest V3 interdit le code distant, et rien de tout cela ne transporte de comptes, de clés secrètes ni de codes générés. La liste complète :
| Hôte | Quand | Transporte des données utilisateur ? |
|---|---|---|
| time.akamai.com timeapi.io cloudflare.com | Vérification de dérive d'horloge, mise en cache ; si aucune source n'est joignable, les Paramètres le disent. TOTP casse si l'horloge dérive. | Non |
| authenticator.sh | Page de bienvenue à l'installation ; page de retour à la désinstallation, avec l'identifiant d'installation dans son adresse ; pages d'aide et d'assistance lorsqu'elles sont ouvertes depuis la fenêtre de l'extension. | L'identifiant d'installation, sur la page de désinstallation uniquement ; sinon non (journaux de serveur web ordinaires) |
| api.authenticator.sh | Appel de facturation une fois par jour ; appels de paiement, de licence et de portail lorsque l'utilisateur achète Pro, saisit une clé, restaure un achat ou gère un abonnement. | Les champs listés ci-dessus — jamais de données de compte. Une clé de licence ou une adresse e-mail uniquement si l'utilisateur en saisit une |
| checkout.stripe.com billing.stripe.com | Stripe Checkout et portail client, ouverts dans un onglet lorsque l'utilisateur achète Pro ou gère un abonnement. | Ce que l'acheteur y saisit. Les conditions propres à Stripe et à Link s'appliquent |
| chromewebstore.google.com | Fiche du store, ouverte dans un onglet sur clic uniquement : le formulaire d'avis depuis l'invite de notation. | Non (Google y voit la consultation d'une page du store comme une autre) |
Aucune police, aucun script, aucun style ni aucune image n'est chargé depuis un hôte tiers. Tout ce qui est nécessaire au rendu de l'interface est livré dans le paquet.
Vous n'avez à croire aucun des points ci-dessus sur parole. L'extension est open source et chaque version est reproductible :
.crx publié depuis le Chrome Web Store et décompressez-lenpm ci && npm run build avec Node 20 LTSdist/ obtenu avec le paquet décompresséUn SHA-256 pour chaque fichier du dist/ produit est publié à chaque version GitHub sous la forme SHA256SUMS-v<version>.txt, au format sha256sum : l'étape 4 se réduit donc à un seul appel à sha256sum -c. Les différences doivent se limiter à l'ordre des fichiers dans les archives et aux espaces dans la sortie minifiée d'une version corrective de Node à l'autre.
Les dépendances d'exécution sont délibérément peu nombreuses — OTPAuth, React, jsQR, Zustand, Framer Motion et Lucide — figées par un fichier de verrouillage versionné. Un SBOM CycloneDX est disponible sur demande.
Consulter le code sourceNous sommes un petit éditeur indépendant. Si l'un des points suivants est une exigence stricte de votre processus, mieux vaut le savoir maintenant qu'au bout de trois semaines d'évaluation :
Ce que nous offrons à la place : une transparence totale du code source, un build vérifiable, une surface de permissions minimale et un serveur auquel ni vos secrets, ni les noms de vos comptes, ni vos codes ne sont jamais envoyés.
Rapports de vulnérabilité et questions de sécurité : security@authenticator.sh. Notre politique de divulgation, son périmètre, nos délais de réponse et les conditions de safe harbour figurent sur la page politique de sécurité ; ce qui est stocké et ce qui quitte l'appareil est exposé dans la politique de confidentialité.
Nous répondons volontiers à un questionnaire écrit d'évaluation fournisseur ou parcourons le code avec une équipe sécurité.
Pour tout ce qui ne relève pas de la sécurité — installation, récupération de compte, questions de facturation liées à un déploiement — voir le support. Merci de ne pas y envoyer de rapports de vulnérabilité : cette boîte n'est pas traitée comme confidentielle.