Un resumen técnico para quien audita la seguridad. Todo lo que hay aquí se puede contrastar con el código fuente, incluido lo que nos deja peor: lo decimos en lugar de omitirlo.
No hay backend. La extensión es una extensión de Chrome con Manifest V3 que genera códigos TOTP/HOTP localmente con OTPAuth. No operamos servidores, no gestionamos cuentas y no existe ningún canal por el que los datos del usuario puedan llegarnos.
Como no hay servidor, tampoco hay material de clave en el servidor, ni depósito de claves, ni ninguna vía de recuperación bajo nuestro control. Si alguien olvida su contraseña y pierde su código de recuperación, no podemos ayudarle: es intencionado.
La protección por contraseña es opcional y está desactivada por defecto. Con ella activada:
Los datos nunca se cifran directamente con una clave derivada de la contraseña. Una clave maestra aleatoria cifra los registros; la salida de PBKDF2 solo envuelve esa clave maestra. De ahí se siguen dos consecuencias, y ambas importan:
Con la protección por contraseña activada se cifra el registro completo de la cuenta salvo su identificador y su huella —incluido el nombre del servicio—, de modo que un perfil robado no revela en qué servicios tiene cuentas el usuario. Al activarla, la extensión cifra los registros, los verifica descifrándolos y comparándolos, y solo entonces elimina todas las copias en claro: almacenamiento local del navegador, sincronización y las siete instantáneas rotativas de respaldo.
Lo decimos sin rodeos, porque afecta a su evaluación:
En resumen: esto protege los datos en reposo. No defiende, ni puede defender, un dispositivo que ya está bajo el control de un atacante mientras se usa.
El manifiesto declara cinco permisos y ningún permiso de host:
No hay No hay scripts de contenido, ni permisos tabs, cookies o webRequest, ni web-accessible resources. Nada nuestro existe en una página hasta que pides un código allí; lo que se ejecuta entonces se inyecta para esa pestaña y esa invocación, bajo el permiso que concede tu propio clic, y no deja nada detrás.
El escaneo de QR con la cámara se ejecuta en una página de la extensión abierta en una pestaña, no en el popup: un popup se destruye al perder el foco, que es justo lo que provoca una solicitud de permiso. Para esto no hace falta ningún permiso en el manifiesto: usa la solicitud de cámara estándar del navegador, concedida por origen de la extensión y revocable en la configuración del sitio, y nunca se pide hasta que el usuario abre el escáner. El vídeo se decodifica localmente y nunca se transmite ni se guarda.
La comprobación del reloj es la única petición que la extensión hace por su cuenta; todo lo demás ocurre porque el usuario ha hecho clic en algo. Manifest V3 prohíbe el código remoto, y nada de esto lleva cuentas, claves secretas ni códigos generados. La lista completa:
| Host | Cuándo | ¿Lleva datos del usuario? |
|---|---|---|
| time.akamai.com timeapi.io cloudflare.com | Comprobación de desfase del reloj, cacheada; si no hay ninguna fuente disponible, Ajustes lo indica. Con el reloj desfasado, TOTP deja de funcionar. | No |
| authenticator.sh | Página de bienvenida al instalar; página de opiniones al desinstalar; páginas de ayuda y soporte cuando se abren desde la ventana emergente. | No (registros normales de servidor web) |
| chromewebstore.google.com | Ficha de la tienda, abierta en una pestaña al hacer clic: el formulario de reseña desde el aviso de valoración, nuestro gestor de contraseñas desde el banner de promoción cruzada. | No (Google ve la visita a una página de la tienda como cualquier otra) |
| authenticator.featurebase.app | Tablón público de propuestas, abierto en una pestaña desde el enlace para sugerir una función en la barra de soporte. | Solo lo que el usuario publique allí. Servicio de terceros con sus propias condiciones. |
No se cargan fuentes, scripts, estilos ni imágenes desde hosts de terceros. Todo lo necesario para representar la interfaz viaja dentro del paquete.
No hace falta creerse nada de lo anterior. La extensión es de código abierto y cada versión es reproducible:
.crx publicado desde la Chrome Web Store y descomprímalonpm ci && npm run build con Node 20 LTSdist/ resultante con el paquete descomprimidoCon cada publicación en GitHub se publica un SHA-256 de cada archivo del dist/ generado, como SHA256SUMS-v<version>.txt y en formato sha256sum, de modo que el paso 4 se reduce a una sola ejecución de sha256sum -c. Las diferencias deberían limitarse al orden de los archivos dentro de los archivos comprimidos y a los espacios en la salida minificada entre versiones de parche de Node.
Las dependencias en tiempo de ejecución son deliberadamente pocas —OTPAuth, React, jsQR, Zustand, Framer Motion y Lucide— fijadas por un lockfile versionado. Facilitamos un SBOM en formato CycloneDX si se solicita.
Ver el código fuenteSomos un proveedor pequeño e independiente. Si alguno de estos puntos es un requisito ineludible en su proceso, mejor saberlo ahora que tres semanas después de empezar la evaluación:
Lo que ofrecemos a cambio es transparencia total del código, una compilación verificable, una superficie mínima de permisos y ninguna infraestructura de servidor que pudiera llegar a guardar sus datos.
Informes de vulnerabilidades y preguntas de seguridad: security@authenticator.sh. Nuestra política de divulgación, su alcance, los plazos de respuesta y las condiciones de safe harbour están en la página de política de seguridad; qué se almacena y qué sale del dispositivo se detalla en la política de privacidad.
Respondemos con gusto a un cuestionario escrito de evaluación de proveedores o revisamos el código con su equipo de seguridad.
Para cualquier asunto que no sea de seguridad —instalación, recuperación de cuentas, dudas de facturación en un despliegue— consulte soporte. Por favor, no envíe ahí informes de vulnerabilidades: ese buzón no se trata como confidencial.