CloudFlare D1 备份说明

将加密后的密文存储到 Cloudflare D1 免费数据库,可通过书签地址随时恢复。
所有加密操作在浏览器本地进行,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 加密后的结果。

解密流程

  1. 从 D1 获取密文,识别 N. 前缀
  2. Base64 解码,分离 IV(前12字节)和密文
  3. 使用公钥 + SALT 派生 ContentKey(同加密流程)
  4. 使用 ContentKey + IV 进行 AES-GCM-256 解密,得到 Curve25519 密文
  5. 使用用户私钥进行 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

隐私说明:公钥和 SALT 存储在 URL 的 # 片段(fragment)中。根据 HTTP 规范,# 及其后的内容不会随请求发送到服务器,网页提供者无法获取您的公钥和 SALT。

重要:请妥善保管书签地址。丢失书签地址(公钥 + SALT)将无法恢复已存储的数据。

注意事项