为开发者提供安全、临时的秘密分享。
别再在 Slack 上粘贴秘密了。enseal 让安全路径比不安全路径更快——通过一条命令和零配置,即可通过加密的一次性通道分享 .env 文件和秘密。```bash
$ enseal share .env Share code: 7-guitarist-revenge Secrets: 14 variables (staging) Expires: on first receive
$ enseal receive 7-guitarist-revenge ok: 14 secrets written to .env
## 安装
### 从 crates.io```bash
cargo install enseal
git clone https://github.com/FlerAlex/enseal.git cd enseal cargo build --release
### 预编译二进制文件
从 [GitHub Releases](https://github.com/FlerAlex/enseal/releases) 下载适用于 Linux (x86_64, aarch64)、macOS (Intel, Apple Silicon) 和 Windows 的版本。
## 快速入门
### 匿名模式(零配置)
使用一次性代码共享机密。无需密钥,无需账户——立即可用。```bash
# terminal 1 (sender)
enseal share .env
Share code: 7-guitarist-revenge
Secrets: 14 variables
Expires: on first receive
# terminal 2 (recipient) — enter the code
enseal receive 7-guitarist-revenge
ok: 14 secrets written to .env
也适用于单个秘密:```bash
echo "my-api-token" | enseal share --label "API key" Share code: 4-orbital-hammock
enseal receive 4-orbital-hammock my-api-token
两个终端必须同时打开——发送方等待接收方连接。
### 身份模式(基于密钥,无需验证码)
适用于已建立密钥信任的团队。加密到名称,无需协调。```bash
# one-time setup
enseal keys init
enseal keys export > my-key.pub # share this with teammates
enseal keys import teammate-key.pub # import theirs
# sender encrypts to recipient by name
enseal share .env --to sarah
# or push through the public relay (no codes at all)
enseal share .env --to sarah --relay wss://relay.enseal.dev
# or produce an encrypted file (no network)
enseal share .env --to sarah --output ./drop/
enseal inject 7-guitarist-revenge -- npm start
enseal inject --listen --relay wss://relay.enseal.dev -- docker compose up
enseal inject ./staging.env.age -- python manage.py runserver
秘密仅存在于子进程的内存中。当子进程退出时,它们就消失了。
## 功能
### 三种共享模式
**匿名模式**(默认)——基于虫洞,零配置。只需一个人可读的代码即可。SPAKE2 相互认证可防止中间人攻击。```bash
enseal share .env # generates wormhole code
enseal receive 7-guitarist-revenge # uses code
With --relay, anonymous mode bypasses wormhole and uses the enseal relay transport instead. Both sides must use the same relay:```bash
enseal share .env --relay ws://relay.internal:4443 # generates channel code
enseal receive 3421-amber-frost --relay ws://relay.internal:4443
**异步上传 (`--upload`)** — 仅发送方使用。在本地加密并发布到 [burnurl.dev](https://burnurl.dev),返回一个自销毁的URL,接收方在浏览器中打开。接收方无需使用CLI。```bash
enseal share .env --upload
# Secret URL: https://burnurl.dev/s/a3f9c2e1...
# Expires: 2026-03-08 19:42:00 UTC (24h)
# Reads: 1 (self-destructs on first open)
接收者可在任意浏览器中打开该URL——无需安装enseal。添加 --passphrase 可在上传前在客户端加密(服务器仅能看到密文):```bash
enseal share .env --upload --passphrase # prompts for passphrase
enseal share .env --upload --ttl 4 # 4-hour TTL (max 24)
API访问需要burnurl.dev上的Pro或团队计划。将`BURNURL_API_KEY`设置为您自己的密钥。可以覆盖自托管实例的基本URL:`BURNURL_URL=https://burnurl.internal`。
**身份模式** — 为已知队友提供公钥加密。加密到名称。```bash
enseal keys init # one-time setup
enseal share .env --to sarah # encrypt to sarah's public key
身份模式支持三种传输选项:```bash
enseal share .env --to sarah
enseal share .env --to sarah --relay wss://relay.enseal.dev
enseal share .env --to sarah --output ./drop/
### 灵活输入
enseal 接受来自多个来源的机密:```bash
# .env file (default)
enseal share .env
enseal share staging.env
# environment profile
enseal share --env staging # resolves to .env.staging
# pipe from stdin
echo "sk_live_abc123" | enseal share
cat secrets.env | enseal share
pass show stripe/key | enseal share --to sarah
# inline (careful — visible in shell history)
enseal share --secret "API_KEY=sk_live_abc123"
# wrap raw string as KEY=VALUE
echo "sk_live_abc123" | enseal share --as STRIPE_KEY
${VAR} 引用在发送前会被解析,因此接收者能获得完全展开的值:```env
DB_HOST=postgres.internal
DB_PORT=5432
DATABASE_URL=postgres://user:pass@${DB_HOST}:${DB_PORT}/myapp
支持 `${VAR:-default}` 后备语法。循环引用和前置引用会被检测并拒绝。使用 `--no-interpolate` 发送原始 `${VAR}` 语法。
### 过滤
控制哪些变量被发送:```bash
# exclude public/non-secret vars
enseal share .env --exclude "^PUBLIC_|^NEXT_PUBLIC_"
# send only matching vars
enseal share .env --include "^DB_|^API_"
# skip .env parsing entirely (send raw file)
enseal share .env --no-filter
输出会根据发送内容自适应:```bash
enseal receive CODE ok: 14 secrets written to .env
enseal receive CODE --output staging.env
enseal receive CODE sk_live_abc123
enseal receive CODE --clipboard ok: copied to clipboard
enseal receive CODE --no-write
enseal receive ./staging.env.age ok: signature verified, file decrypted ok: 14 secrets written to .env
### 注入
接收秘密并将它们直接作为环境变量注入到子进程中。秘密永远不会触及文件系统。```bash
# anonymous mode: inject via wormhole code
enseal inject 7-guitarist-revenge -- npm start
# identity mode: listen for incoming transfer on relay
enseal inject --listen --relay wss://relay.enseal.dev -- docker compose up
# from encrypted file drop
enseal inject ./staging.env.age -- python manage.py runserver
使用 --listen 参数,接收方连接到中继并等待。发送方通过 enseal share .env --to alex --relay wss://relay.enseal.dev 推送——无需交换代码,无需协调。
除了共享,enseal 还是一个完整的 .env 安全工具包:```bash
enseal check error: missing from .env (present in .env.example): JWT_SECRET, REDIS_URL
enseal diff .env.development .env.staging
enseal redact .env DATABASE_URL= API_KEY= PORT=
enseal validate .env error: missing required: JWT_SECRET error: PORT value "abc" is not an integer ok: 11/14 variables passed validation
enseal template .env
### 静态加密
使用 age 加密对 `.env` 文件进行加密,以便安全地存储在 git 中:```bash
# whole-file encryption
enseal encrypt .env
ok: .env encrypted in-place (14 variables, age key)
enseal decrypt .env
# per-variable: keys visible for diffing, values encrypted
enseal encrypt .env --per-var
# DB_HOST=ENC[age:abc123...]
# DB_PORT=ENC[age:def456...]
# multi-recipient: anyone on the team can decrypt
enseal encrypt .env --to sarah --to alex
enseal keys init
enseal keys export > my-key.pub
enseal keys import sarah.pub
enseal keys list