sealed-env
sealed-env

Encripta tu .env.
Ábrelo en el deploy.

Una librería cross-stack (Node + Java / Spring Boot) para secretos encriptados en disco, con apertura ligada a TOTP para deploys en producción. Diseñada contra los ataques de cadena de suministro que rompieron 2024–2026.

El problema

El .env en texto plano no sobrevivió a 2024–2026.

Gusano Shai-Hulud (npm) Nov 2025

Un gusano auto-replicante en el ecosistema npm escaneó equipos de devs y CI runners buscando archivos .env y los publicó en repos abiertos de GitHub. Miles de credenciales filtradas.

tj-actions/changed-files Mar 2025

Una GitHub Action muy popular fue comprometida. Cada job que la usaba volcó sus variables de entorno en logs públicos de CI. El radio de impacto alcanzó decenas de miles de repos.

Campaña GhostAction 2024–2025

Una ola coordinada de tokens de CI robados, usada para publicar paquetes troyanizados y cosechar más secretos — apalancando justamente los tokens que la mayoría de equipos guardan junto a su .env.

El patrón es el mismo: el acceso de lectura al sistema de archivos o al entorno de un proceso se convierte en acceso total a las credenciales. Encriptar en disco no basta — si la llave maestra se filtra junto con el archivo, la bóveda se abre.

La solución

Tres modos. Tú eliges el modelo de amenazas.

basic

Para devs en solitario y repos privados.

  • AES-256-GCM
  • KDF scrypt / Argon2id
  • Solo llave maestra

Defiende contra: filtraciones de backups, pushes accidentales a git, heap dumps tras el wipe de la llave.

team

Para repos compartidos y CI.

  • Todo lo de basic
  • + Integridad HMAC-SHA256
  • + Llave de firma independiente

Defiende contra: manipulación interna, compromiso de solo la llave maestra (el HMAC falla antes de intentar descifrar).

enterprise

Para deploys en producción.

  • Todo lo de team
  • + Token de apertura TOTP corto (RFC 6238)
  • + Desafío ligado al deploy (commit SHA)

Defiende contra: pasos de CI comprometidos, tokens capturados y reusados en otro deploy, phishing AitM al operador.

Ver el pipeline de descifrado por modo
   basic                    team                     enterprise
   ─────                    ────                     ──────────

   .env.sealed              .env.sealed              .env.sealed
        │                        │                        │
        ▼                        ▼                        ▼
   ┌─────────┐              ┌─────────┐              ┌─────────┐
   │ AES-GCM │              │  HMAC   │              │  HMAC   │
   │ decrypt │              │ verify  │              │ verify  │
   └────┬────┘              └────┬────┘              └────┬────┘
        ▼                        ▼                        ▼
   plaintext                ┌─────────┐              ┌─────────┐
                            │ AES-GCM │              │  TOTP   │
                            │ decrypt │              │  token  │
                            └────┬────┘              │ verify  │
                                 ▼                   └────┬────┘
                            plaintext                     ▼
                                                     ┌─────────┐
                                                     │ deploy  │
                                                     │  bind   │
                                                     └────┬────┘
                                                          ▼
                                                     ┌─────────┐
                                                     │ AES-GCM │
                                                     │ decrypt │
                                                     └────┬────┘
                                                          ▼
                                                     plaintext

Tour de 30 segundos

El mismo archivo. Dos stacks.

Un archivo .env.sealed escrito por la CLI de Node se desencripta limpio desde un servicio Java / Spring Boot, y al revés. Verificado byte-a-byte por tests automáticos de interop cross-stack en cada commit.

Node npm install sealed-env
// 1. encripta tu .env existente (CLI)
$ SEALED_ENV_KEY=$(openssl rand -hex 32) \
    npx sealed-env seal .env
// → escribe .env.sealed (commit este)

// 2. lee al arrancar
import { loadSealed } from "sealed-env";
loadSealed();
console.log(process.env.API_KEY);
Java / Spring Boot 3 io.github.davidalmeidac:sealed-env-spring-boot-starter
// application.yml
sealed-env:
  enabled: true
  path: .env.sealed
  fail-fast: true

// en cualquier bean — los valores llegan descifrados
@Value("${API_KEY}")
private String apiKey;

Modelo de amenazas

Contra qué defendemos — y contra qué no.

Una herramienta de seguridad sin un modelo de amenazas público es marketing. El nuestro está acá, mapeando cada defensa a un incidente real de 2024–2026.

Tipo de ataque Defendido por
Gusano Shai-Hulud (exfiltración del entorno)basic
Filtración de backup / S3 públicobasic
CVEs de heapdump en Spring Bootbasic (llave borrada tras derivación)
Manipulación interna del .env.sealedteam
Compromiso de CI tipo tj-actions / GhostActionenterprise + CHALLENGE-BIND
Phishing AitM del TOTP (EvilProxy)enterprise + CHALLENGE-BIND (parcial)
Host de producción comprometido con shellFuera de alcance (no hay defensa en runtime)
KMS / laptop del operador comprometidoFuera de alcance (v0.3.x: llaves con HSM)

Ayuda a construirlo

Esto es v0.1.0-alpha. Hay mucho por hacer.

sealed-env se construye en abierto desde Bucaramanga, Colombia. Es MIT y no hay empresa detrás — todavía. Ahora mismo necesita gente que se preocupe por tres cosas:

Soy David Almeida, dev backend autodidacta en Bucaramanga. Si querés colaborar, escribime a davidalmeidac@proton.me o por GitHub. Buscando feedback técnico, colaboradores, y eventualmente un equipo.