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.
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
- 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.
Cada proyecto tiene una sola tarea, y puedes leerlos todos en GitHub:
| Proyecto | Qué 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.
.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.
.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.
| Parte | Impacto de una computadora cuántica | Situación |
|---|---|---|
| Bóveda en reposo | Shor no aplica. Grover reduce AES-256 a unos 128 bits | Segura con una frase de contraseña fuerte |
| Respaldos de recuperación | RSA o curvas elípticas solas quedarían rotas | Híbrido ECDH P-384 + ML-KEM-768: sigue siendo secreto si cualquiera de los dos resiste |
| Archivos de versión | Las firmas RSA o ECDSA se podrían falsificar | Firmados con ML-DSA-65 (FIPS 204) |
| Espacio de la llave de seguridad | HMAC-SHA-256 simétrico dentro de la llave | No le afecta como a RSA; sigue haciendo falta la llave y su PIN |
| Espacio de Windows Hello | Usa una clave RSA en el TPM | Aú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 respaldo | Solo si adivina la contraseña maestra | AES-256-GCM y Argon2id. Lo que importa es una frase larga |
| Modifica el archivo de la bóveda | No | Todo está autenticado: un archivo dañado no se abre |
| Prepara un archivo malicioso | No | Parámetros, tamaños y descompresión se limitan antes |
| Espía la red | No | Solo sale texto cifrado, y WebDAV exige https |
| Malware con la bóveda bloqueada | No | Nada en el disco abre la bóveda sin la contraseña o el aviso de Hello |
| Tiene tu llave de seguridad pero no su PIN | No | La llave pide su PIN y un toque, y demasiados PIN erróneos la bloquean |
| Tiene tu computadora y tu PIN de Windows | Sí, con Windows Hello | Hello es tan fuerte como tu PIN o tu biometría |
| Obtiene un archivo que guardaste fuera de una entrada | Sí, ese archivo | Un adjunto guardado es un archivo normal en el disco, fuera de la bóveda. Elimínalo cuando termines |
| Malware con la bóveda desbloqueada | Sí | 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.
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.
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.
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
- README e instrucciones de compilación (se abre en una pestaña nueva)
- Modelo de seguridad (se abre en una pestaña nueva)
- Modelo de amenazas (se abre en una pestaña nueva)
- Criptografía poscuántica (se abre en una pestaña nueva)
- Arquitectura (se abre en una pestaña nueva)
- Autoevaluación OWASP (se abre en una pestaña nueva)
- Hoja de ruta (se abre en una pestaña nueva)
- Registro de cambios (se abre en una pestaña nueva)