加密与安全

零知识架构——你的密钥、你的数据、你做主

AES-256-GCM 端到端加密

所有备份数据在离开你的设备之前,就用 AES-256-GCM 加密。GCM 自带认证,无需额外的 HMAC。Ginkgo 只用这一种加密算法——只有一条路径需要审计,没有「选错算法」的风险。

项目
加密算法AES-256-GCM
密钥长度256 位
密码派生Argon2id(time=3, memory=64MB, threads=4)
派生用途Argon2id 派生 KEK 包装主密钥;HKDF-SHA256 用于云 GC 读取路径派生 blob 密钥
Nonce 长度12 字节

密钥层级

采用多层密钥设计:用户密码派生密钥加密密钥(KEK)来包装主密钥,主密钥统一加密所有数据块与清单。云仓库使用各自独立的主密钥,与本机仓库互不影响。

层级说明
User Password用户密码(可选输入,启用加密后必填)
KEK (Argon2id)密钥加密密钥,由密码经 Argon2id 派生,仅用于在 repo.key 中包装主密钥
Master Key主密钥,随机 32 字节,统一加密所有 blob(GB1/GB2)与清单(GKM1)
Cloud Repo Master Key云仓库主密钥,每个云后端独立生成,与本机主密钥互不影响
repo.key 文件存储被 KEK 包装后的主密钥(GEK1 二进制或 JSON 格式)

零知识设计

加密密钥只生成并存储在你的设备上,Ginkgo 服务器无法读取你的数据。即使云存储被入侵,没有密钥拿到的也只是无法识别的密文。

恢复码——忘记密码的救命稻草

零知识加密意味着:忘记密码 = 数据无法恢复。所以务必在开启加密后导出恢复码并妥善保存(比如打印出来或存到密码管理器)。

⚠️ 没有密码也没有恢复码,任何人都无法帮你恢复数据——这是零知识加密的代价,也是它安全的原因。

凭证加密存储

云存储凭证(S3 密钥、WebDAV 密码、OAuth Token)用仓库加密密钥加密后存入本地数据库,API 响应中永远不会返回解密后的凭证。

勒索软件防护

Ginkgo 的跨仓库保护能检测异常的文件批量变更。通过 WebDAV 同步到云端的备份与本机完全隔离,勒索软件无法触及。即使本机被感染,云端备份依然安全,可以回滚到中毒前的版本。

配置保险库

安全备份和恢复应用配置——设置、调度、仓库布局。重装系统后无需重新配置,一键恢复全部设置。

密钥导出与导入

通过 API 导出加密密钥用于灾难恢复,或导入到新机器以重新访问旧备份。

TLS 与本地 CA

当 API 服务监听 0.0.0.0 或在 headless 模式下运行时,Ginkgo Backup 会自动开启 TLS,使用 ECDSA P-256 算法生成本地 CA 和服务器证书。CA 证书包含 NameConstraints 与用户配置的公网 IP SANs(以 /32 或 /128 网段写入 PermittedIPRanges),避免与其他实例的 CA 冲突。

首次启用 TLS

1

运行 ginkgo-server --tls-auto 自动生成本地 CA 和服务器证书

2

运行 ginkgo-server --tls-trust(需要管理员权限)将 CA 安装到系统信任库;安装前会自动清理同名旧 CA

3

CLI 端使用 --tls 或导出 GINKGO_TLS=1 通过 HTTPS 连接

💡 自签证书仅用于本机和局域网。如需公网访问,建议在前端反向代理(如 Caddy/Nginx)启用公开 CA 签发的证书。

TOTP 双因素认证

为 WebUI 登录启用 TOTP(基于时间的一次性密码)双因素认证,防止密码泄露导致账号被接管。TOTP 端点位于 /api/v1/auth/totp/*。

1

POST /api/v1/auth/totp/setup 开始设置,返回二维码与密钥

2

在 Authenticator App(Google Authenticator、1Password 等)扫码绑定

3

POST /api/v1/auth/totp/confirm 提交验证码确认绑定

4

POST /api/v1/auth/totp/disable 可禁用 2FA(需要当前 TOTP 码)

💡 启用 2FA 后,每次登录除密码外还需输入动态验证码。请务必保存备用恢复码,避免手机丢失导致无法登录。

WebUI 访问密码

当 API 服务监听 0.0.0.0 时,强烈建议设置 WebUI 访问密码,防止局域网内未授权访问。Token 与密码配合使用:Token 用于 API 客户端,密码用于浏览器登录 WebUI。

1

运行 ginkgo-server --set-password <密码> 设置密码后退出

2

或通过 API POST /api/v1/auth/password 修改密码

3

浏览器首次访问 WebUI 会要求输入密码,登录后建立会话

💡 设置密码不会影响已配置的 Token 认证。CLI/API 调用仍使用 Bearer Token,密码只保护浏览器会话。