¡Hoy estamos en Product Hunt! Dejar un comentario
Ya está disponible Authenticator 1.16.0. Ver las novedades
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.
La extensión es una extensión de Chrome con Manifest V3 que genera códigos TOTP localmente con OTPAuth. Generar códigos, guardar las cuentas y cifrarlas no implica ningún backend, y no hay cuentas de usuario. Operamos un único servidor, api.authenticator.sh, para el plan gratuito y Pro —descrito más abajo—, y nunca recibe un secreto, un nombre de cuenta, un emisor ni un código.
Ese servidor no guarda material de clave de las cuentas de nadie: no hay 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.
Desde la 1.14.0, la extensión consulta api.authenticator.sh una vez al día: al iniciarse el navegador o después de que se haya mostrado el popup, nunca de camino a mostrar un código. La petición es una lista cerrada de campos, construida en una sola función en src/billing/sync.ts y ceñida a esa lista por una prueba:
Nunca se envían: secretos, nombres de cuenta, emisores, códigos ni los sitios en los que se usan. El servidor obtiene el país de la petición en el edge y no guarda la dirección IP. La página de desinstalación recibe el mismo identificador de instalación como ?i=: avisa al servidor de que la instalación se ha eliminado y vincula a ella una respuesta opcional a la encuesta.
Para esto se guarda en chrome.storage.local: el identificador de instalación, la última política y la última licencia firmadas, la clave de licencia que tiene esta instalación (escrita por el usuario o recibida tras comprar en ella), los recuentos diarios de aperturas hasta que el servidor los reciba y los eventos en cola; ningún dato de cuentas. Con la sincronización activada, también van a Chrome Sync el dato de si la instalación es anterior a la facturación y esa clave de licencia, para que los otros perfiles de Chrome del usuario los reciban y activen Pro solos; al desactivar la sincronización se quitan ambos de Chrome Sync, y al volver a activarla se vuelven a poner.
Qué se recibe de vuelta y cómo lo trata la extensión:
El límite no es DRM: el código es abierto y un fork puede quitarlo. Lo que nunca debe ser posible es que alguien obtenga o use la licencia de otra persona, o que consiga limitar la instalación de otro: eso es una vulnerabilidad y entra en el alcance de nuestra política de seguridad.
Hay dos tipos de petición que la extensión hace por su cuenta: la comprobación del reloj y la consulta diaria de facturación. 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, con el identificador de instalación en su dirección; páginas de ayuda y soporte cuando se abren desde la ventana emergente. | El identificador de instalación, solo en la página de desinstalación; por lo demás, no (registros normales de servidor web) |
| api.authenticator.sh | La consulta de facturación, una vez al día; llamadas de pago, licencia y portal cuando el usuario compra Pro, introduce una clave, restaura una compra o gestiona una suscripción. | Los campos enumerados arriba, nunca datos de cuentas. Una clave de licencia o una dirección de correo, solo cuando el usuario la escribe |
| checkout.stripe.com billing.stripe.com | Stripe Checkout y el portal de clientes, abiertos en una pestaña cuando el usuario compra Pro o gestiona una suscripción. | Lo que el comprador introduzca allí. Se aplican las condiciones de Stripe y de Link |
| 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. | No (Google ve la visita a una página de la tienda como cualquier otra) |
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 un servidor al que, de entrada, nunca se le envían sus secretos, nombres de cuenta ni códigos.
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.