1093 字
5 分鐘
閱後即焚:瀏覽器端加密的私密文本分享站
🔥 在線體驗:https://sealed.ouneed.tech —— 本文中介紹的閱後即焚私密分享站,打开即用。
0. TL;DR:先給結論
| 問題 | 結論 |
|---|---|
| 這是什麼? | 一個跑在 Cloudflare Workers + D1 上的閱後即焚文本分享站 |
| 怎麼保證隱私? | AES-256-GCM 瀏覽器端加密;服務端只存密文;解密密鑰在 URL fragment,不經過服務器 |
| 分享鏈接長什麼樣? | https://<隨機>.workers.dev/s/xxx#k=xxx —— 中性域名,無身份關聯 |
| 能存多大? | 單條最大 500KB(加密後) |
1. 為什麼做這個?
有時候需要給別人發一段敏感信息:服務器密碼、API 密鑰、一次性憑證。用微信、郵件發,記錄永遠留在聊天記錄裡;用網盤分享,還要註冊登錄。
閱後即焚解決這個問題:發一次,看完就沒了。
市面上有不少類似工具,但要麼要註冊、要麼服務器能看到明文、要麼域名一看就是誰的。自己做一個,乾淨。
2. 安全設計
2.1 瀏覽器端加密
核心原則:服務器永遠看不到明文。
- 寫密箋時,瀏覽器生成 32 字節隨機主密鑰
- 用 HKDF-SHA256 從主密鑰派生 AES 密鑰和讀取憑證
- 正文用 AES-256-GCM 加密,AAD 綁定應用標識和鹽值
- 只有密文、IV、鹽值、憑證哈希上傳到服務器
2.2 密鑰只在 URL fragment
解密用的主密鑰放在 URL 的 #k= 後面(fragment):
https://s8ded10ec12.x7k2m9q4test.workers.dev/s/xxx#k=yyyFragment 不會隨 HTTP 請求發送到服務器——瀏覽器只在本地用它解密。這意味著即使服務器被入侵,攻擊者拿到數據庫也解不開(沒有密鑰)。
2.3 閱後即焚
- 可設置 1–10 次領取,默認 1 次
- 領取時用原子 SQL 操作扣次數,歸零立即刪除記錄
- 可設置 5 分鐘 / 1 小時 / 24 小時 / 7 天有效期
- 創建時可生成獨立的撤銷憑證,隨時手動銷毀
2.4 隱私隔離
分享出去的鏈接用 Cloudflare 的 workers.dev 中性域名:
- worker 名是隨機字符(如
s8ded10ec12),無含義 - 賬號子域名也是隨機的(如
x7k2m9q4test),不暴露賬號信息 - 對方從鏈接反向查不到你的其他站點(博客、郵局、2FA 等)
主站(創建用)是自己的域名,分享鏈接(發出去)是中性域名,兩者隔離。
2.5 額外密碼(可選)
可以再加一道密碼:密碼參與本地密鑰派生(PBKDF2-SHA256,600,000 次迭代)。即使有人拿到完整鏈接,沒有這個密碼也解不開。建議通過不同渠道發送鏈接和密碼。
3. 技術架構
純 Cloudflare,不用 R2(文本夠小,D1 完全夠用):
瀏覽器 (加密/解密) ↓ HTTPS (只傳密文)Cloudflare Worker ↓D1 數據庫 (存密文 + 元數據)- 限流:單 IP 每小時創建 20 條、每分鐘讀取 30 次(D1 原子計數)
- 定時清理:每天 Cron 刪除過期記錄
- CSP:嚴格的 Content-Security-Policy,內聯腳本按 SHA256 哈希白名單
4. 使用場景
- 給同事發服務器 root 密碼(看完即焚,不留記錄)
- 分享 API 密鑰給外包(設置 1 次領取 + 1 小時有效期)
- 傳遞一次性 2FA 恢復碼
- 任何”只想讓對方看一次”的信息
5. 侷限性(誠實地說)
- 不能防止截圖/複製:對方看到內容後可以保存,這是所有類似工具的共同侷限
- 不保證立即擦除:D1 可能有備份,刪除記錄不代表所有介質立即擦除
- 信任 Cloudflare:雖然是端到端加密,但前端代碼是從 CF 加載的,理論上存在被篡改的風險(已用 CSP + SRI 緩解)
- 網絡中斷:領取時如果網絡中斷,次數可能已消耗但內容沒送達(已在界面明確提示)
6. 開源與部署
代碼基於提示詞由 GPT 生成,我負責部署、UI 美化、安全加固。核心改動:
- 分享鏈接強制用中性 workers.dev 域名(隱私隔離)
- UI 美化:配色、漸變、交互細節
- 修復 CSP 哈希(改代碼後必須重新計算,否則瀏覽器攔截)
- 補上缺失的
RATE_LIMIT_SECRET環境變量
部署方式:wrangler deploy,D1 建表,設 Cron,綁自定義域名。全程免費額度搞定。
有敏感信息要傳?試試 https://sealed.ouneed.tech,閱後即焚,片字不留。
閱後即焚:瀏覽器端加密的私密文本分享站
https://blog.ouneed.tech/posts/sealed-burn-after-read/