CloudFlare D1 备份说明
将加密后的密文存储到 Cloudflare D1 免费数据库,可通过书签地址随时恢复。
所有加密操作在浏览器本地进行,CloudFlare 端只存储密文,无法获取明文。
安全性
- 存储内容经过 Curve25519 + AES-GCM-256 双层加密后上传
- CloudFlare D1 持有者、管理员及任何第三方均无法解密查看明文
- 解密需要 私钥/密码短语 和 SALT,二者缺一不可
- CloudFlare 仅作为密文存储介质,不参与加密/解密过程
加密流程
保存到 D1 时,明文经过两层加密:
第一层:Curve25519 加密
使用用户的公钥对明文进行 Curve25519 加密,生成密文。
解密此层需要对应的私钥(由密码短语通过 PBKDF2 派生)。
注意:私钥和密码短语不会保存在本地,也不会包含在书签地址中。请您自行妥善保管。一旦遗忘,已存储的数据将永久丢失,无法恢复。
第二层:AES-GCM-256 加密
使用由公钥和 SALT 派生的内容密钥对第一层密文进行 AES-GCM-256 加密。
密钥派生
内容加密密钥通过 HMAC-SHA512 两层派生生成:
PRK = HMAC-SHA512(key=pubkey, data=salt)
ContentKey = HMAC-SHA512(key=PRK, info="d1_content")[0..31]
最终 ContentKey 截取前 32 字节,作为 AES-GCM-256 的加密密钥。
D1 存储 Key 派生
D1 记录的唯一标识 key 同样由 HMAC-SHA512 派生:
PRK = HMAC-SHA512(key=pubkey, data=salt)
D1Key = HMAC-SHA512(key=PRK, info="cloudflare-d1-access")[0..32]
最终 D1Key 截取前 33 字节,转为 Base64 编码后作为 D1 记录的 key。
AES-GCM 加密细节
| 参数 | 值 |
|---|---|
| 算法 | AES-GCM |
| 密钥长度 | 256 bit (32 字节) |
| IV 长度 | 12 字节,随机生成 |
| 存储格式 | IV(12字节) + 密文 |
存储格式
D1 中存储的密文以 N. 为前缀标识,整体结构如下:
N. + Base64Encode(IV + AES-GCM-Ciphertext)
其中 AES-GCM-Ciphertext 的明文是 Curve25519 加密后的结果。
解密流程
- 从 D1 获取密文,识别
N.前缀 - Base64 解码,分离 IV(前12字节)和密文
- 使用公钥 + SALT 派生 ContentKey(同加密流程)
- 使用 ContentKey + IV 进行 AES-GCM-256 解密,得到 Curve25519 密文
- 使用用户私钥进行 Curve25519 解密,得到明文
书签地址
书签地址中包含公钥和 SALT,是恢复数据的唯一凭证:
https://example.com/?t=2026-07-23T01:14:30.454Z#&data2=DAAQACAAIABceG8pL9GtzHPWdMPlq5Gu3RutHpSGd_rYcDrTjabBwd6y1_z_MQevVrlUup0N5vdY7-XYGVqbpMv1ceo04dwdqULRaSyD2saGjmUeW1EbUdSeUjwkEvjjk6BDHYnp_aKtKLnVQEeR4OgBGAe13pa_GpoEfMf1SGCLIk4SVg0pHF3aUdvAwoxmNc_6E5GlDOXiHzIHhny8RPIHTbUwLFZ35c0BTI5kSR-6stze0pAiG2MM3iF6Nu_RXkg70ZG3GWE2R2MS8uf7qKGTBN2YBNiICvy37OeH8DcDCyzAv-CTKYxHcMCz9gKrt5NH1HT8Kow7w1zZxatEAM_yIKVIKjOM8gCmuD1awZjJK4jtV7_RzqiC3snKXLBuGj2tX0VsPW_amt6jNWsNSSA9ADZpA7CazSSAwoGnnJiZoP_jcGSuNZw95sgZMTLW7-zSc5kjYzkHXwiZ1pTVEMS2CLJZY0Vv
- 公钥:用于 Curve25519 解密和密钥派生
- SALT:用于 HMAC-SHA512 密钥派生
隐私说明:公钥和 SALT 存储在 URL 的
#片段(fragment)中。根据 HTTP 规范,#及其后的内容不会随请求发送到服务器,网页提供者无法获取您的公钥和 SALT。
重要:请妥善保管书签地址。丢失书签地址(公钥 + SALT)将无法恢复已存储的数据。
注意事项
- 采用 Cloudflare D1 免费数据库,不保证可靠性
- 同一公钥 + SALT 下可保存多条记录,但受免费 D1 容量限制,后期可能会删除部分早期数据,恕不另行通知
- 请定期导出备份,不要仅依赖 D1 存储