数据加密概述:静态加密与传输加密
加密这件事,说简单也简单,就是把数据变成别人看不懂的乱码。但真正落地的时候,很多人只盯着一种加密方式,忽略了另一个。我早期带团队做对象存储方案时,就踩过这个坑——只做了传输加密,结果数据落盘后直接明文躺着,被审计揪出来一顿批。
所以这一章,咱们把“静态加密”和“传输加密”这两个维度彻底理清楚。你看完就能明白:为什么两者缺一不可?它们分别防谁?在对象存储里怎么配?
静态加密:保护“躺着”的数据
静态加密,英文叫 Encryption at Rest。说白了,数据存到磁盘上那一刻是密文,哪怕有人把硬盘拔走,他也读不出内容。
我在一个金融客户的项目里遇到过这种情况:他们的对象存储底层用的是自建Ceph集群。运维不小心把一块报废的SSD扔到了公开回收站,幸好当时开了服务端加密,否则客户交易记录就全泄漏了。嗯,从那以后,我每次给客户做方案,第一件事就是确认静态加密是否启用。
常见实现方式
- 服务端加密(SSE):对象存储服务自动帮你加密,你只管上传。AWS S3 的 SSE-S3、SSE-KMS、SSE-C 都属于这类。
- 客户端加密:你在上传前自己用密钥加密,服务端只存密文。密钥管理全在自己手里。
- 文件系统/卷加密:底层存储设备层加密,比如 Linux LUKS、硬件加密卡。服务本身感知不到。
| 加密方式 | 密钥谁管 | 性能损耗 | 适用场景 |
|---|---|---|---|
| SSE-S3 | 服务商 | 极低 | 合规基线、通用场景 |
| SSE-KMS | 客户(通过KMS) | 低 | 合规审计、密钥轮换要求高 |
| SSE-C | 客户提供密钥 | 低 | 自有密钥、脱离KMS生态 |
| 客户端加密 | 客户完全自主 | 中等(加密在客户端) | 高安全、离线/本地优先 |
传输加密:保护“流动”的数据
传输加密,Encryption in Transit。数据从客户端到服务端,或者服务节点之间互相复制的时候,不能被中间人截获或篡改。
你想想看,如果没有 TLS,你在咖啡厅连公共 WiFi 上传文件,黑客用 Wireshark 一抓包,你的客户资料就裸奔了。这也是为什么现代对象存储 API 都强制 HTTPS。
两种传输场景
- 客户端 ↔ 服务端:最常见。通过 TLS/SSL 加密 HTTP 请求。对象存储的 REST API 全部跑在 HTTPS 上。
- 服务端 ↔ 服务端:跨区域复制、内部节点同步。有些厂商用内部 TLS 或 IPSec,有些甚至明文传输(别笑,我见过生产环境没开内部加密的)。
• 对象存储入口强制 TLS 1.2+
• 节点间通信也开启 TLS
• 使用 mTLS(双向证书)做服务身份验证
静态 vs 传输:一张图说清楚边界
我习惯用下面这张图来解释两者的覆盖范围。黄色是传输加密的领地,蓝色是静态加密的领地。重叠区域就是数据在传输过程中同时被保护——其实传输结束后,静态加密才开始生效。
为什么两者必须同时用?
我曾经帮一个电商平台做事故复盘:他们只启用了传输加密(HTTPS),但存储后端用了自研的分布式文件系统,没落盘加密。黑客通过一个内部API漏洞进了内网,直接在存储节点上跑 cat /data/*.bin 就能看到明文商品库存和用户手机号……你说这事故冤不冤?
反过来,如果只做静态加密,不做传输加密,攻击者可以在数据传输过程中嗅探或篡改。比如中间人篡改你的上传请求,把一个配置文件换成恶意脚本,服务端存储时虽然加密了,但源头已经被污染了。
① 全链路传输加密(客户端→服务端,服务端→服务端)
② 所有落盘数据静态加密(至少是服务端加密级别)
③ 密钥与数据分离存储(密钥管理边界——这正是本课程的核心)
实际配置时的常见误区
- 误区一:HTTPS 就算传输加密了,还能怎么坏?——很多对象存储 SDK 默认使用 HTTPS,但如果你显式传参指定
http://或者不对证书做校验,流量可能降级为明文。我曾经见过某开发为了方便调试,在代码里写死了allow_insecure=True,上线忘了改回来…… - 误区二:静态加密选 SSE-S3 就够了。——对大部分场景是够的,但如果秒级删除需求、合规审计场景需要密钥独立管理,SSE-KMS 更靠谱。另外,SSE-S3 的密钥轮换周期你根本控制不了。
- 误区三:内部网络不需要加密。——别信。云环境里的 VPC 隔离只是逻辑隔离,除非你用了物理硬隔离,否则内部流量依旧有被截获的风险。我所在的团队去年发现某公有云对象存储的内网副本同步居然走明文 TCP,后来加了内部 TLS 才封上。
说白了,加密不是一锤子买卖。静态加密和传输加密就像门锁和窗锁——你只锁门,小偷翻窗户进来照样完蛋。把它们两者放在一起理解,你才能画出合理的密钥边界蓝图。