Añadir a Chrome

Cómo funciona

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.

Arquitectura

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.

Criptografía

La protección por contraseña es opcional y está desactivada por defecto. Con ella activada:

Cifrado
AES-256-GCM, IV aleatorio de 96 bits por registro y por reescritura
Derivación de clave
PBKDF2-HMAC-SHA256, 600.000 iteraciones, sal aleatoria de 128 bits (recomendación de OWASP)
Clave maestra
256 bits, de crypto.getRandomValues, generada una sola vez; la contraseña solo la envuelve
Huellas
HMAC-SHA256 con una subclave derivada por HKDF, usada para fusionar registros entre dispositivos
Almacenamiento de la clave desbloqueada
chrome.storage.session — solo en memoria, nunca se escribe en disco, se borra al cerrar el navegador e inalcanzable desde scripts de contenido
Bloqueo automático
En cada apertura / a los 5, 15 o 60 minutos de inactividad / hasta que se cierre el navegador
Implementación
Solo WebCrypto. Ninguna primitiva está escrita a mano y no se empaqueta ninguna biblioteca criptográfica.

Por qué hay dos niveles de clave

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:

  • Cambiar la contraseña reescribe 32 bytes en lugar de volver a cifrar cada registro, cada copia de seguridad y cada exportación. Esa reescritura masiva es justo donde los sistemas de almacenamiento pierden datos.
  • Un código de recuperación de 160 bits puede envolver la misma clave maestra de forma independiente, así que una contraseña olvidada tiene remedio. El código se muestra una vez, hay que volver a escribirlo para confirmarlo y se renueva tras cada uso. No se escribe nada en disco hasta que el usuario lo ha confirmado.

Qué se cifra y qué no

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:

  • Con la protección por contraseña desactivada, las cuentas se guardan sin cifrar y, si Chrome Sync está activo, se replican a través de la propia cuenta de Google del usuario. Nosotros nunca las recibimos, pero Google las tiene. La sincronización puede desactivarse, lo que además elimina lo que ya haya allí.
  • El historial de uso por sitio —qué cuenta se usa en qué dominio— se guarda localmente y no queda cubierto por la bóveda mientras se recopila. Activar la protección por contraseña lo borra; también puede desactivarse por separado.

Modelo de amenazas

Protege frente a

  • Un directorio de perfil del navegador robado o copiado
  • Malware infostealer que exfiltra datos del navegador en bloque
  • Alguien con acceso físico a un equipo desatendido
  • Registros de cuentas que llegan a Google mediante Chrome Sync
  • La pérdida o el robo de un archivo de copia de seguridad (exportación protegida con contraseña)

No protege frente a

  • Malware ejecutándose como el usuario mientras la bóveda está desbloqueada
  • Un keylogger que capture la contraseña mientras se teclea
  • Un navegador o un sistema operativo comprometidos
  • El compromiso de los servicios de terceros para los que son los códigos

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.

Permisos

El manifiesto declara exactamente dos permisos y ningún permiso de host:

storage
Cuentas y ajustes en el almacenamiento local, la clave desbloqueada en el de sesión y la copia opcional de sincronización
activeTab
Lee el nombre de host de la pestaña activa para destacar la cuenta correspondiente, y captura la pestaña cuando el usuario escanea un código QR desde la pantalla

No hay scripts de contenido, ni permisos tabs, cookies o webRequest, ni recursos accesibles desde la web. La extensión no puede leer ni modificar el contenido de ninguna página.

Cámara

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.

Tráfico de red saliente

La extensión no hace ninguna petición automática en uso normal, y Manifest V3 prohíbe el código remoto. Todas las conexiones que puede llegar a hacer:

HostCuándo¿Lleva datos del usuario?
worldtimeapi.org
timeapi.io
Comprobación de desfase del reloj, cacheada, falla en silencio. Con el reloj desfasado, TOTP deja de funcionar.No
authenticator.shPágina de bienvenida al instalar; página de opiniones al desinstalar o al valorar.No (registros normales de servidor web)

No se cargan fuentes, scripts, estilos ni imágenes desde hosts de terceros. Todo lo necesario para representar la interfaz viaja dentro del paquete.

Verificar lo que publicamos

No hace falta creerse nada de lo anterior. La extensión es de código abierto y cada versión es reproducible:

  1. Descargue el .crx publicado desde la Chrome Web Store y descomprímalo
  2. Sitúese en la etiqueta de git correspondiente
  3. Ejecute npm ci && npm run build con Node 20 LTS
  4. Compare el dist/ resultante con el paquete descomprimido

Con 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 fuente

Lo que no tenemos

Somos 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:

  • Sin certificación SOC 2, ISO 27001 ni equivalente
  • Ninguna prueba de intrusión externa encargada hasta la fecha
  • Sin programa remunerado de bug bounty

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.

Cómo contactarnos

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.