
Extensión de navegador de código abierto para cifrado, descifrado y firma PGP. Motor Rust/WASM con desbloqueo WebAuthn PRF, protección de contraseña Argon2id y memoria zeroizada.
Extensión de navegador de código abierto para cifrado, descifrado y firma PGP.
Construida con Rust/WebAssembly. Las claves privadas nunca tocan el heap de JS a menos que sea necesario.
Código abierto y transparente. La mayoría de las extensiones de navegador PGP son de código cerrado. No deberías confiar tus secretos a una caja negra.
La criptografía se ejecuta en WASM, no en JavaScript. Todas las operaciones PGP se ejecutan en una caja de arena WebAssembly de Rust/Sequoia-PGP. JS solo contiene un identificador entero opaco para tu clave; los bytes reales viven en la memoria lineal de WASM y se ponen a cero al liberarse. Las claves privadas pasan brevemente por JS durante la generación e importación antes de ser cifradas y almacenadas.
Desbloqueo con clave de acceso (passkey). Protege las claves con WebAuthn PRF: desbloquea con Touch ID, Face ID, Windows Hello o un YubiKey en lugar de una contraseña. La salida de PRF se combina con un secreto almacenado mediante HKDF-SHA256, y todo el flujo de desbloqueo se ejecuta en WASM.
Argon2id para contraseñas. 64 MB de memoria, 3 iteraciones: resistente a ataques de fuerza bruta con GPU. El KDF, el descifrado y el almacenamiento de claves ocurren en WASM. Los bytes de la contraseña se ponen a cero en ambos lados inmediatamente después de su uso.
Descifrado + verificación atómico. El texto plano y el resultado de la firma se devuelven juntos en una única respuesta empaquetada. Firma incorrecta = no se devuelve texto plano. Sin ventana TOCTOU.
Puesta a cero en todas partes. zeroize crate en todas las claves almacenadas e intermedias (Rust). Uint8Array.fill(0) en contraseñas, salidas PRF y claves derivadas (JS). La memoria de WASM no se recolecta como basura, por lo que la puesta a cero es determinista.
AAD por clave. Cada clave privada se cifra con AES-256-GCM utilizando Datos Autenticados Adicionales vinculados a su huella digital. Intercambiar blobs entre ranuras de claves falla.
.crx) para las cargas CRX verificadas de la Web Store (opcional; desactivado por defecto)pnpm install
pnpm dev # servidor de desarrollo con recarga en caliente
pnpm test # pruebas unitarias (vitest); pruebas del motor Rust: cargo test in apps/pgp/gpg-wasm
pnpm build # compilación de producción (compila WASM automáticamente)
pnpm zip # empaquetar para Chrome Web Store / Firefox Add-ons
El módulo WASM debe compilarse desde el código fuente. Para recompilar manualmente:
cd apps/pgp && pnpm build:wasm
apps/pgp/ Código fuente de la extensión
components/ Interfaz de usuario React
entrypoints/ fondo (background) + panel lateral
hooks/ llavero, sesiones, contactos
lib/pgp/ envoltorio WASM + operaciones
lib/protection/ WebAuthn PRF, Argon2id, AES-256-GCM
lib/storage/ chrome.storage con mutex
gpg-wasm/ motor Rust/WASM (sequoia-openpgp)
packages/ui/ componentes shadcn/ui
tooling/ eslint, prettier, tailwind, tsconfig
Construida con ayuda significativa de IA (Claude). La interfaz de usuario, la fontanería de React, el almacenamiento y el cableado de la extensión fueron generados en gran parte por IA.
Las implementaciones criptográficas (motor Rust/WASM, protección de claves, WebAuthn PRF, configuración de Argon2id) fueron diseñadas y revisadas por humanos. No confiamos en la criptografía basada en "vibraciones".
MIT
| Capa | Mecanismo |
|---|
| Motor criptográfico | Sequoia-PGP en WASM (las claves en JS solo durante generación/importación) |
| Desbloqueo de claves | WebAuthn PRF (passkeys) o Argon2id 64 MB (contraseñas) |
| Almacenamiento de claves | AES-256-GCM con AAD por clave |
| Memoria | zeroize crate (Rust) + borrado manual (JS) |
| Firmas | Descifrado+firma atómico (sin TOCTOU) |
| Sesiones | Bloqueo automático por inactividad, cierre del panel o por operación |
| Fuerza bruta | Retardo exponencial en intentos fallidos de desbloqueo |
| Alcance | Sin scripts de contenido - solo sandbox de extensión |