AES-256-GCM 静态加密 · HKDF-SHA256 密钥派生 · GCM 认证标签防篡改
输入明文,观察字符如何被逐个加密为不可识别的密文。每文件独立密钥,即使输入相同,密文也完全不同。
GCM 认证标签确保密文任何一字节被篡改,解密都会失败。点击「篡改一字节」观察效果。
完整的文件上传安全改造,从静态加密到动态访问控制,多层防护。
文件落盘即加密,银行级算法。即使硬盘被偷、备份泄漏,攻击者看到的也只是乱码。
主密钥 + (org_id, file_id) 派生每文件独立密钥。同内容两个文件密文完全不同。
文件被篡改一字节都会被检测,解密抛异常拒绝返回内容。完整性 + 真实性双重保障。
下载链接 HMAC-SHA256 签名,10 分钟自动过期。即使链接被泄漏,时间窗口有限。
Referer 同源校验 + robots.txt + 速率限制(60/min)。爬虫无法批量抓取文件。
uploader / 同 chat 成员 / org admin。无权限用户即使拿到链接也无法下载。
明文哈希入库,可验证解密后内容与上传时一致。审计追溯有据可查。
修复 allow_origins=["*"] 漏洞,仅允许白名单域名跨域访问。OWASP 合规。
用真实数据与攻击场景,说明每一层防护的实际效果。这不是营销话术,是数学与工程。
AES-256 的密钥空间是 2256 ≈ 1.16 × 1077 种组合。 假设攻击者拥有 2024 年 10 月比特币全网算力历史峰值(698 EH/s ≈ 6.98 × 1020 Hash/s,数据来源:blockchain.com), 每次尝试消耗一次 AES 运算,破解一个文件需要的时间如下:
💡 结论: AES-256 的破解时间是宇宙年龄的 1038 倍以上。即使等到所有红矮星熄灭(约 1014 年后), 破解进度也只完成 10-34(0.00...01,中间 33 个 0)。这是密码学意义上"计算不可行"——不是"很难",而是"宇宙不允许"。
数据来源:AES-256 密钥空间 2256(FIPS 197); 比特币全网算力 698 EH/s(blockchain.com 2024-10-10 数据); 宇宙年龄 13.8 Gyr(Planck 2018 卫星观测); 红矮星寿命上限 1014 年(Adams & Laughlin 1997)。 计算公式:2256 / 6.98×1020 / 3.156×107 ≈ 5.27 × 1048 年。
系统不直接使用主密钥加密文件,而是用 HKDF-SHA256 从主密钥 + (org_id, file_id) 派生 每个文件独立的子密钥。 即使攻击者通过其他途径(例如内存转储、内核漏洞)获取了某个文件的密钥, 也只能解密那一个文件,无法解密同一服务器上的其他文件。
file_key_1 = HKDF(master_key, salt=(org_id, file_id_1)) → 0x3a9f...
file_key_2 = HKDF(master_key, salt=(org_id, file_id_2)) → 0x7e2b... ← 完全不同
file_key_3 = HKDF(master_key, salt=(org_id, file_id_3)) → 0xc1d8... ← 完全不同
即使 file_key_2 泄漏:
- file_id_1 的文件仍安全 ✓
- file_id_3 的文件仍安全 ✓
- master_key 仍安全 ✓(HKDF 单向不可逆)
GCM(Galois/Counter Mode)不仅是加密算法,更是认证加密(AEAD)。
它会在密文末尾附加 16 字节的 认证标签(Authentication Tag),
该标签是密文 + IV + 密钥的 Galois 域多项式哈希。任何对密文、IV 或 tag 的篡改,
在解密时都会立即检测出来,抛出 InvalidTag 异常,拒绝返回任何明文。
| 攻击手段 | 传统加密 (CBC) | GCM (本项目) | 说明 |
|---|---|---|---|
| 密文被篡改 1 字节 | 解密出错误明文(可能被利用) | 立即检测,拒绝返回 | GCM 任何字节改动都会让 tag 校验失败 |
| IV 被替换 | 可能成功解密(被攻击) | tag 校验失败,拒绝 | IV 也是 tag 的输入 |
| 重放攻击(旧密文重发) | 可能成功 | IV 唯一性校验 | 每次加密 IV 随机,重复 IV 立即暴露 |
| 密文顺序颠倒 | 无法检测 | tag 失败 | GCM 对字节位置敏感 |
| 密文截断 | 解密出残缺明文 | tag 校验失败 | 长度不匹配立即拒绝 |
↑ 这意味着即使黑客拿到了磁盘原始密文并改了哪怕一个 bit, 系统也能识别出来,绝不会把"被篡改过的错误数据"返回给用户。
假设攻击者试图获取目标文件,从外到内必须依次攻破 6 道防线。每一层失败都会让攻击彻底终止。
/signed-url 获取 token,
token 用 HMAC-SHA256 签名,绑定 file_id + actor_id,10 分钟过期。
| 机制 | 具体配置 | 防什么 | 绕过难度 |
|---|---|---|---|
| 速率限制 | 每用户/IP 每分钟 60 次 | 批量下载、爆破、DoS | 需大量代理 IP 池 |
| Referer 同源校验 | Referer 必须为 null 或在 CORS 白名单 | 跨站 CSRF 下载、外部直接链接 | 几乎无法绕过(浏览器强制) |
| robots.txt | Disallow /api/ + /files/, Allow /health | 搜索引擎索引、合规爬虫 | 仅对合规爬虫有效 |
| 签名 URL 过期 | 10 分钟(600 秒)HMAC 签名 | 链接泄漏后长期被利用 | 需在 10 分钟内完成利用 |
| Content-Disposition | HTML/SVG/XML/JS 强制 attachment | XSS via 文件类型混淆 | 浏览器层强制 |
| X-Frame-Options: DENY | 禁止 iframe 嵌入 | 点击劫持 (Clickjacking) | 浏览器层强制 |
| X-Content-Type-Options: nosniff | 禁止 MIME 嗅探 | MIME sniffing XSS | 浏览器层强制 |
| CORS 白名单 | 仅允许 localhost:3000/4000 | 跨域 AJAX 滥用 | 需服务器配置错误才能绕过 |
| 能力维度 | 明文存储(传统) | AES-CBC 加密 | AES-256-GCM (本项目) |
|---|---|---|---|
| 磁盘被偷 | 全部泄漏 | 加密但可篡改 | 加密 + 防篡改 |
| 备份泄漏 | 全部泄漏 | 加密但密钥同盘则失效 | HKDF 派生,主密钥分离 |
| 密文被改动 1 字节 | 无检测 | 解密错误明文(危险) | 立即拒绝,InvalidTag |
| 单文件密钥泄漏 | N/A | 所有文件可解 | 仅 1 个文件受影响 |
| 下载链接泄漏 | 永久有效 | 永久有效 | 10 分钟自动过期 |
| 爬虫批量抓取 | 无限制 | 无限制 | 60/min 限速 |
| 跨站链接盗用 | 可被任意网站引用 | 可被引用 | Referer 校验阻断 |
| 合规认证 | 无 | 部分合规 | NIST/NSA/PCI/等保 |
根据 IBM《2024 Cost of a Data Breach Report》(Ponemon Institute 调研,样本:全球 604 家企业,2023.3-2024.2):
数据来源:IBM Security & Ponemon Institute《Cost of a Data Breach Report 2024》。 其中医疗行业连续 14 年成本最高($9.77M),较 2023 年下降 11%; 识别+控制周期从 2023 年的 277 天降至 258 天(得益于 AI 与自动化); 知识产权记录成本较 2023 年上升 11%。
💡 本方案的价值: 即使发生最坏情况(服务器被入侵、硬盘被克隆、备份被盗), 攻击者拿到的也只是 AES-256-GCM 密文——0 字节明文可读。 在监管视角下,密文不构成"个人数据泄露事件":
加密成本远低于一次泄露事件成本。
注:具体合规判定需咨询法律顾问,以上仅为通用原则。 等保 2.0 三级要求 8.1.4.1 d) 加密存储个人敏感信息(GB/T 22239-2019)。