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.
Il n'y a pas de backend. L'extension est une extension Chrome Manifest V3 qui génère les codes TOTP/HOTP localement avec OTPAuth. Nous n'exploitons aucun serveur, ne gérons aucun compte et n'avons aucun canal par lequel des données utilisateur pourraient nous parvenir.
Puisqu'il n'y a pas de serveur, il n'y a pas non plus de matériel de clé côté serveur, 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.
La vérification de l'horloge est la seule requête que l'extension émet d'elle-même ; 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 ; pages d'aide et d'assistance lorsqu'elles sont ouvertes depuis la fenêtre de l'extension. | Non (journaux de serveur web ordinaires) |
| chromewebstore.google.com | Fiche du store, ouverte dans un onglet sur clic uniquement : le formulaire d'avis depuis l'invite de notation, notre gestionnaire de mots de passe depuis la bannière de promotion croisée. | Non (Google y voit la consultation d'une page du store comme une autre) |
| authenticator.featurebase.app | Tableau public des demandes de fonctionnalités, ouvert dans un onglet depuis le lien de demande de fonctionnalité de la barre d'assistance. | Uniquement ce que l'utilisateur y publie. Service tiers, soumis à ses propres conditions. |
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 aucune infrastructure serveur susceptible de détenir vos données.
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.