MasterSafe Authenticator: autenticador y bóveda de contraseñas privados y sin conexión

Mi app de escritorio para códigos de un solo uso y contraseñas: cómo funciona, cómo está hecho el código, todas sus funciones y qué tan segura es, sin rodeos.

Logo de MasterSafe Authenticator

MasterSafe Authenticator es una app de escritorio que desarrollo en .NET 10 para Windows y Linux. Genera los códigos de un solo uso (TOTP y HOTP) que protegen tus cuentas y los guarda, junto con tus contraseñas, en una bóveda cifrada en tu propia computadora. No necesita cuenta ni nube, y no envía telemetría. La única conexión de red que hace es a un servidor de respaldos que tú eliges.

Lo que el nombre promete y lo que no: ningún software es invulnerable. Esta página explica qué protege MasterSafe, cómo lo hace y dónde están sus límites.

297

métodos de prueba automatizados en el repositorio

27 de 41

controles de OWASP ASVS cumplidos en mi autoevaluación

0

telemetría, cuentas o archivos de registro

Todo lo que hace

Todas las funciones de la app, agrupadas por su propósito. Por ahora la interfaz está en inglés.

Códigos

TOTP y HOTP

RFC 6238 y RFC 4226, con SHA-1, SHA-256 o SHA-512 y 6 u 8 dígitos. Agrega cuentas desde un enlace otpauth:// o una imagen con código QR: arrástrala a la ventana o elige el archivo.

Contraseñas

Bóveda de contraseñas

Entradas al estilo KeePass con generador de contraseñas. Los códigos y contraseñas copiados se borran del portapapeles a los 30 segundos.

Contraseñas

Carpetas y acciones múltiples

Árbol de carpetas para contraseñas, con un ícono para cada carpeta a elegir entre 24. Crea, renombra, mueve y elimina carpetas, y selecciona varias entradas para moverlas o eliminarlas juntas.

Contraseñas

Archivos adjuntos

Adjunta archivos a una entrada, hasta 5 MiB cada uno y 50 MiB por bóveda. Se guardan cifrados dentro de la bóveda y se incluyen en los respaldos de recuperación.

Desbloqueo

Tres formas de desbloquear

Contraseña maestra (Argon2id), Windows Hello o una llave de seguridad FIDO2, probada con una llave Thales SafeNet. Cada una es un espacio de clave separado.

Sesión

Bloqueo automático

La bóveda se bloquea tras el tiempo de inactividad que elijas. Al bloquearse, borra de la memoria la clave y los datos descifrados.

Respaldos

Respaldos cifrados

Respaldos .sauth en una carpeta local o en un servidor WebDAV como Nextcloud u ownCloud, solo por https. No existe exportación en texto plano.

Recuperación

Clave de recuperación

Una clave de recuperación y sus respaldos te devuelven tus datos si olvidas la contraseña maestra. La app puede generar por ti la frase de la clave. No hay puerta trasera.

Bóvedas

Página de bóvedas

Muestra dónde están tus archivos, abre cualquier bóveda (una memoria USB, otra carpeta) y archiva o elimina las antiguas tras una confirmación.

Importar

Importación de KeePass

Lee exportaciones XML o CSV de KeePass y KeePassXC. Los grupos se vuelven carpetas y también se importan los archivos adjuntos de las exportaciones XML. Primero muestra un resumen y no agrega nada hasta que confirmes.

Versiones

Descargas verificables

Cada archivo tiene una suma SHA-256 y una firma poscuántica ML-DSA-65, y una pequeña herramienta los comprueba todos de una vez.

Escritorio

Uso diario

Bandeja del sistema, temas claro y oscuro, ayuda integrada y ajustes que se recuerdan entre sesiones.

Cómo protege la bóveda tus datos

Tus cuentas y contraseñas se cifran con una clave de datos aleatoria de 256 bits. Esa clave nunca se guarda tal cual. Se conserva una vez por cada método de desbloqueo, en un espacio de clave (slot), envuelta con una clave que solo ese método puede producir. Por eso, cambiar la contraseña maestra o agregar Windows Hello nunca vuelve a cifrar la bóveda.

Jerarquía de claves de la bóveda Contraseña maestra Argon2id + sal Windows Hello firma + HKDF Llave FIDO2 hmac-secret + HKDF Espacio: contraseña Espacio: Hello Espacio: llave Clave de datos aleatoria de 256 bits se borra de la memoria al bloquear Tus cuentas y contraseñas AES-256-GCM
Cada método de desbloqueo abre su propio espacio, y todos llevan a la misma clave de datos. El envoltorio usa AES-256-GCM.
  • Todo está autenticado. AES-256-GCM protege el contenido, y el encabezado y los espacios de clave también quedan vinculados: no se pueden pasar piezas de una bóveda a otra ni cambiar la etiqueta de un espacio.
  • Los guardados son atómicos. Primero se escribe y se vacía a disco el archivo nuevo, después se intercambia, y la versión anterior queda como vault.sauth.bak.
  • Los archivos se tratan como no confiables. Los parámetros de Argon2, el tamaño de los archivos (100 MiB las bóvedas y los respaldos), el tamaño descomprimido (96 MiB) y los adjuntos (5 MiB cada uno, 50 MiB en total) se limitan antes de empezar, para que un archivo manipulado no agote la memoria.
  • Una clave equivocada nunca sobrescribe. Antes de guardar se comprueba que la clave abre la bóveda existente.

Cómo está hecho el código

La solución está escrita en C# sobre .NET 10, con una interfaz MVVM en Avalonia 12 (se abre en una pestaña nueva), y dividida en proyectos pequeños. Las dependencias van en un solo sentido: el dominio no sabe nada de las pantallas, y toda la criptografía vive en una sola biblioteca. El código exclusivo de Windows está detrás de #if WINDOWS, y los métodos de desbloqueo implementan una sola interfaz, ISecretProvider, para que el formato de la bóveda no dependa de la plataforma.

Capas de la solución MasterSafe INTERFAZ MasterSafe.App app de escritorio Avalonia 12 MasterSafe.Cli verifica las versiones SERVICIOS Backup respaldos, WebDAV Platform Hello, FIDO2, bandeja QR códigos QR SEGURIDAD Crypto Argon2id, AES-GCM, espacios PostQuantum ML-KEM, ML-DSA DOMINIO Core TOTP, HOTP, Base32, otpauth, cuentas, contraseñas
Las dependencias apuntan hacia abajo. Core no depende de nada.

Cada proyecto tiene una sola tarea, y puedes leerlos todos en GitHub:

ProyectoQué hace
MasterSafe.Core (se abre en una pestaña nueva)TOTP RFC 6238, HOTP RFC 4226, Base32, analizador otpauth, modelos de cuentas, contraseñas y adjuntos, importación de KeePass
MasterSafe.Crypto (se abre en una pestaña nueva)Argon2id, AES-256-GCM, formato de bóveda 3 con espacios de clave, contenedor de adjuntos, repositorio atómico de archivos, GZip con límite
MasterSafe.PostQuantum (se abre en una pestaña nueva)ML-KEM-768, híbrido ECDH P-384 + ML-KEM-768, firma de versiones con ML-DSA-65
MasterSafe.Backup (se abre en una pestaña nueva)Respaldos con contraseña y con clave de recuperación, proveedores de carpeta local y WebDAV
MasterSafe.Platform (se abre en una pestaña nueva)Desbloqueo con Windows Hello y FIDO2, bandeja del sistema
MasterSafe.QR (se abre en una pestaña nueva)Lectura y generación de códigos QR con ZXing.Net y SkiaSharp
MasterSafe.App (se abre en una pestaña nueva)La interfaz de escritorio en Avalonia: vistas, modelos de vista y servicios
MasterSafe.Cli (se abre en una pestaña nueva)Herramientas de versión: verify-release, verify, fingerprint, keygen, sign

En tamaño, la app son unas 12 400 líneas de C# y XAML en src, más otras 6 000 líneas de pruebas. Las pruebas cubren vectores de los RFC, la seguridad de la bóveda y los modelos de vista. MasterSafe.Data es una biblioteca de persistencia que la app no usa por ahora.

Líneas de código por proyecto MasterSafe.App MasterSafe.App: 6 453 6 453 MasterSafe.Tests MasterSafe.Tests: 6 009 6 009 MasterSafe.Core MasterSafe.Core: 1 449 1 449 MasterSafe.Crypto MasterSafe.Crypto: 1 403 1 403 MasterSafe.Backup MasterSafe.Backup: 799 799 MasterSafe.Data MasterSafe.Data: 656 656 MasterSafe.Platform MasterSafe.Platform: 610 610 MasterSafe.PostQuantum MasterSafe.PostQuantum: 545 545 MasterSafe.QR MasterSafe.QR: 260 260 MasterSafe.Cli MasterSafe.Cli: 178 178
Líneas de archivos .cs y .axaml por proyecto, con líneas en blanco, en la versión 1.3.1. Las pruebas van en gris.

Este es un ejemplo pequeño y real de la regla de que los archivos no son confiables. Los parámetros de Argon2 vienen del archivo de la bóveda, así que Models.cs (se abre en una pestaña nueva) los revisa antes de reservar memoria:

public void Validate()
{
    if (DegreeOfParallelism is < 1 or > MaxParallelism
        || Iterations is < 1 or > MaxIterations
        || MemorySizeKib < 8 * DegreeOfParallelism
        || MemorySizeKib > MaxMemorySizeKib
        || KeyLength != 32)
    {
        throw new InvalidDataException("The key-derivation parameters in this file are outside the accepted range.");
    }
}

Otros buenos puntos de partida son VaultService.cs (se abre en una pestaña nueva) para los espacios de clave, HybridKemProvider.cs (se abre en una pestaña nueva) para el esquema híbrido y Fido2HmacSecretProvider.cs (se abre en una pestaña nueva) para las llaves de seguridad. Ningún algoritmo criptográfico está escrito a mano: vienen de .NET, del sistema operativo y de una biblioteca pública de Argon2.

Si olvidas la contraseña maestra

No hay puerta trasera, así que una contraseña perdida no se puede restablecer. En su lugar, te preparas. En la página Recovery creas una clave de recuperación y, de vez en cuando, un respaldo de recuperación que solo esa clave puede abrir. Cualquier dispositivo con la clave pública puede escribir uno, y para crearlo no hace falta ninguna contraseña. Puedes elegir tú la frase de contraseña o dejar que MasterSafe la genere: 30 caracteres aleatorios, sin letras que se confundan, que se muestran una sola vez para que los anotes.

Cómo se cifra un respaldo de recuperación Clave pública la app solo guarda esta Encapsulado híbrido ECDH P-384 + ML-KEM-768 Secreto compartido HKDF-SHA-384 Clave de datos aleatoria envuelta por el secreto compartido recovery-*.sauth toda la bóveda, AES-256-GCM
Solo la clave privada de recuperación puede abrir el respaldo. Vive en un archivo .msrk protegido con una frase de al menos 12 caracteres, y ese archivo se guarda lejos de esta computadora.
  • Primero, prueba otro método de desbloqueo. Windows Hello o una llave de seguridad quizá sigan abriendo la bóveda.
  • Después, usa "Forgot your master password?" en la pantalla de inicio para restaurar un respaldo de recuperación en una bóveda nueva.
  • Por último, empieza una bóveda nueva. La anterior se archiva, nunca se elimina, y se puede abrir si aparece la contraseña.

¿Y las computadoras cuánticas?

Los datos cifrados que se roben hoy podrían guardarse y atacarse más adelante, así que cada parte de la app se revisó por separado. ML-KEM y ML-DSA vienen de .NET 10 y del sistema operativo (Windows CNG, u OpenSSL 3.5+ en Linux). Si falta el proveedor, el código se detiene en lugar de producir un resultado débil.

ParteImpacto de una computadora cuánticaSituación
Bóveda en reposoShor no aplica. Grover reduce AES-256 a unos 128 bitsSegura con una frase de contraseña fuerte
Respaldos de recuperaciónRSA o curvas elípticas solas quedarían rotasHíbrido ECDH P-384 + ML-KEM-768: sigue siendo secreto si cualquiera de los dos resiste
Archivos de versiónLas firmas RSA o ECDSA se podrían falsificarFirmados con ML-DSA-65 (FIPS 204)
Espacio de la llave de seguridadHMAC-SHA-256 simétrico dentro de la llaveNo le afecta como a RSA; sigue haciendo falta la llave y su PIN
Espacio de Windows HelloUsa una clave RSA en el TPMAún no es poscuántico. Seguro frente a quien solo tenga el archivo de la bóveda. Si esto te importa, no agregues Hello

Entonces, ¿qué tan segura es?

La respuesta honesta depende de quién ataca y cuándo. Este es el modelo de amenazas del repositorio:

Atacante¿Puede leer la bóveda?Por qué
Roba la bóveda o un respaldoSolo si adivina la contraseña maestraAES-256-GCM y Argon2id. Lo que importa es una frase larga
Modifica el archivo de la bóvedaNoTodo está autenticado: un archivo dañado no se abre
Prepara un archivo maliciosoNoParámetros, tamaños y descompresión se limitan antes
Espía la redNoSolo sale texto cifrado, y WebDAV exige https
Malware con la bóveda bloqueadaNoNada en el disco abre la bóveda sin la contraseña o el aviso de Hello
Tiene tu llave de seguridad pero no su PINNoLa llave pide su PIN y un toque, y demasiados PIN erróneos la bloquean
Tiene tu computadora y tu PIN de WindowsSí, con Windows HelloHello es tan fuerte como tu PIN o tu biometría
Obtiene un archivo que guardaste fuera de una entradaSí, ese archivoUn adjunto guardado es un archivo normal en el disco, fuera de la bóveda. Elimínalo cuando termines
Malware con la bóveda desbloqueadaSíUn programa que corre como tú puede leer una app desbloqueada. El bloqueo automático solo acorta ese tiempo

Frenar los intentos de adivinar la contraseña

Si alguien roba el archivo, cada intento de adivinar la contraseña maestra paga el costo de Argon2id. Los valores por defecto son 128 MiB de memoria, 3 pasadas y 4 carriles, frente a un mínimo de OWASP de 19 MiB y 2 pasadas. Las contraseñas maestras nuevas necesitan al menos 12 caracteres.

Memoria de Argon2id por cada intento Mínimo de OWASP Mínimo de OWASP: 19 MiB 19 MiB MasterSafe MasterSafe: 128 MiB 128 MiB
Más memoria por intento encarece el hardware para ataques a gran escala. Ayuda a una buena frase de contraseña, pero no puede rescatar una débil.

Autoevaluación con OWASP ASVS

Evalué la app con las partes de OWASP ASVS 4.0.3 (se abre en una pestaña nueva) que aplican a un programa de escritorio sin conexión, y la lista completa (se abre en una pestaña nueva) es pública. Es una autoevaluación, no una certificación.

Controles de OWASP ASVS 4.0.3 por resultado Cumplido Cumplido: 27 27 Parcial Parcial: 7 7 Brecha Brecha: 4 4 No aplica No aplica: 3 3
Las 41 filas de la tabla ASVS de la lista. Cumplido significa implementado y cubierto por pruebas o por CI.

Límites conocidos

No están escondidos en letra pequeña. El repositorio también los enumera:

  • Todavía no tiene una revisión de seguridad independiente.
  • Las contraseñas maestras nuevas no se comparan con listas de contraseñas filtradas, y la app no agrega una espera tras varios intentos fallidos.
  • El instalador de Windows no tiene firma Authenticode, así que SmartScreen muestra una advertencia. La firma ML-DSA-65 es la forma de verificarlo.
  • El historial del portapapeles de Windows puede capturar un valor copiado antes de que se borre.
  • La contraseña maestra que escribes es una cadena de .NET, que no se puede borrar de la memoria hasta que se recolecta.
  • El desbloqueo por hardware solo funciona en Windows, y por ahora solo admite una llave de seguridad por bóveda. En Linux se entra con la contraseña maestra.
  • El paquete de Linux se compila y se prueba en CI, pero todavía no se ha probado en un escritorio Linux real.

En resumen: con una frase larga, una bóveda o un respaldo robados están muy bien protegidos, y la red nunca ve tus secretos. No puede protegerte del malware que corre como tú mientras la bóveda está abierta. Tómala como un proyecto personal hecho con cuidado y documentado abiertamente, que todavía no tiene una auditoría externa.

Cómo se revisa cada versión

En la práctica, muchos problemas de seguridad vienen de componentes desactualizados, así que el proceso hace este trabajo en cada cambio. Un paquete con una vulnerabilidad conocida hace fallar la compilación, CodeQL y Gitleaks corren en cada envío, Dependabot propone actualizaciones y el CI genera un SBOM que se adjunta a la versión. Además, cada versión incluye el runtime de .NET con los parches más recientes disponibles al compilarla.

De un cambio en el código a una versión firmada Cada envío GitHub Actions Compilar y probar Windows + Linux Auditoría de paquetes falla si hay vulnerables CodeQL + Gitleaks análisis de código y secretos Etiqueta de versión compilaciones autónomas ML-DSA-65 + suma SHA-256
La fila superior y el análisis de código corren en cada cambio. Una etiqueta de versión compila, firma y prepara un borrador de la versión.

Descargar y verificar

Consigue la versión 1.3.1 en la página de versiones (se abre en una pestaña nueva): el instalador para Windows 10 y 11 (x64) o el paquete para Linux (x64 o arm64). No necesitas instalar .NET. Descarga todos los archivos en una carpeta, incluidos masterSafe-release.pub y la herramienta MasterSafe-Cli, y ejecuta:

MasterSafe-Cli-1.3.1-win-x64.exe verify-release . masterSafe-release.pub

Cada archivo debe mostrar signature valid, checksum ok, y la huella de la clave que se imprime primero debe ser:

28ad8deb1624d6f04fe9100e25edb2666ad904e02824af14ef2fe6c8d2a74b8a

Los pasos completos, incluido cómo compilar el verificador desde el código, están en el README (se abre en una pestaña nueva).

Licencia y cómo reportar un problema

MasterSafe Authenticator es gratuito para uso personal no comercial. El código está disponible para revisarlo y para uso personal, pero no es código abierto: no se permite el uso comercial ni distribuir versiones modificadas. Consulta la licencia (se abre en una pestaña nueva). Los componentes de terceros conservan sus propias licencias, que aparecen en los avisos (se abre en una pestaña nueva).

Si encuentras un problema de seguridad, usa el reporte privado de GitHub (se abre en una pestaña nueva) en lugar de abrir un issue público.

Más información en el repositorio