2. 加密基础理论:对称加密、非对称加密、哈希算法
做对象存储 SDK 加密参数调优之前,得先把加密本身搞明白。不夸张地说,我见过不少开发者在 AES 密钥长度上调了半天,结果问题出在哈希碰撞上。所以这一章我们老老实实过一遍三大加密家族的原理和适用场景。
2.1 对称加密:又快又简单,但密钥怎么给?
对称加密,说白了就是加密和解密用同一把钥匙。就像你家里大门锁,你拿钥匙锁上,回来再拿同一把钥匙打开。算法包括 AES、DES、3DES、SM4 等,目前业界主流是 AES-256-GCM。
核心流程:
- 发送方生成一个随机密钥(Key)和初始向量(IV)。
- 发送方用 Key + IV 对明文加密,得到密文。
- 接收方拿到同样的 Key + IV,才能正确解密。
我个人的习惯:永远不要用 ECB 模式。我在项目里踩过坑——用 AES-ECB 加密了一组图片,结果同一区域的像素块完全暴露了图片结构。后来换成 GCM,带认证加密,安全性和性能都兼顾了。
常见算法对比:
| 算法 | 密钥长度 | 安全等级 | 推荐场景 |
|---|---|---|---|
| AES-128-GCM | 128 bit | 高 | 移动端、IoT 设备 |
| AES-256-GCM | 256 bit | 极高 | 服务端、对象存储大文件 |
| SM4 | 128 bit | 国密标准 | 国内合规场景 |
应用场景:
- 对象存储服务端加密(SSE-C / SSE-S3)
- 数据库列加密
- 文件系统透明加密
我曾经踩过的坑:密钥写死在代码里,上线后被运维同事从二进制文件里扒了出来。后来改用 KMS 动态获取,每次加密前从密钥管理服务拉取密钥,至少安全了一个量级。
2.2 非对称加密:安全分发密钥的利器
非对称加密的核心思想是“公私钥对”——公钥加密,私钥解密。公钥可以公开,私钥必须保密。算法有 RSA、ECC、SM2 等。
为什么需要它?你想过吗:对称加密的密钥怎么安全地传给对方?直接明文传输等于白加密。非对称加密就是专门解决这个“密钥分发”问题的。
工作原理:
- Bob 生成一对密钥:公钥 PK、私钥 SK。
- Alice 拿到 Bob 的公钥,用 PK 加密对称密钥(AES Key)。
- Bob 用自己的私钥 SK 解密,得到 AES Key。后续通信就用对称加密。
这套流程就是经典的 混合加密(Hybrid Encryption),实际 TLS 握手采用的就是类似思路。
常用算法对比:
| 算法 | 密钥长度 | 安全强度 | 计算开销 |
|---|---|---|---|
| RSA-2048 | 2048 bit | 高 | 慢(约 1000 倍于 AES) |
| ECC-P256 | 256 bit | 极高(等效 RSA-3072) | 快 |
| SM2 | 256 bit | 国密标准 | 适中 |
我个人推荐:新项目优先用 ECC。我在一个边缘计算项目里用过 RSA-4096,RSA 私钥运算慢到 CPU 飙 100%。换成 ECC P-256 后,性能提升了 5 倍,安全等级反而更高。
2.3 哈希算法:不可逆的指纹
哈希算法不是加密——本质上它没有“解密”这一步。它把任意长度的数据变成固定长度的摘要(Digest)。一个优秀的哈希函数具有:单向性、抗碰撞性、雪崩效应(输入变一点,输出全变)。
- 常见算法:MD5(已淘汰)、SHA-1(已被谷歌碰撞攻击)、SHA-256、SHA-3、SM3
- 主流选择:SHA-256 或 SHA-3-256
- 国标:SM3
应用场景:
- 文件完整性校验:上传对象时附带哈希值,下载后验证是否被篡改。
- 密码存储:用户密码需要加盐后做哈希,不能明文存储。
- 数字签名:对哈希值签名,而非对原文签名。
- 数据去重:对象存储里常用哈希作为分块指纹。
我遇到过的一个典型问题:某客户用 MD5 做对象存储的 ETag 校验,结果两个不同文件碰巧 MD5 相同,导致覆盖了正确数据。嗯,从那以后我对没加盐的 MD5 就深恶痛绝了。
2.4 三者如何协作?
实际系统中,三种加密技术往往是组合使用的。比如一个安全的对象上传流程:
- 客户端生成随机 AES Key,用对称加密加密文件内容(速度快)。
- 用服务端公钥(RSA/ECC)加密这个 AES Key,附带在请求中。
- 对整个请求(密文+加密密钥)计算 SHA-256 哈希,作为完整性校验。
这就是现代加密体系的典型分工:对称加密管大数据量的加密速度,非对称加密管密钥的安全分发,哈希算法管数据完整性验证。
注意:哈希算法不要和加密混为一谈。我在代码评审里看到过有人把密码用 SHA-256 哈希后当作“加密”,然后试图解出原文,这是不可能的。哈希是不可逆的,请牢记。
2.5 小结:选哪个?何时用?
你想想看,实际调优的时候,第一步是确定 加密用途:
- 要加密大量数据 → 对称加密(AES-256-GCM)
- 要安全交换密钥 → 非对称加密(ECC P-256)
- 要检测数据是否被篡改 → 哈希(SHA-256)
- 要存密码 → 哈希加盐(bcrypt / Argon2)
很多云厂商的对象存储 SDK 默认采用 AES-256 加密,同时支持用户提供自己的密钥(SSE-C)。这时候你只需要关心密钥的管理和轮换策略,加密算法本身已经经过行业验证了。
一个小建议:在开始调优之前,先在纸上画出你当前系统的数据流,标出哪里用对称、哪里用非对称、哪里用了哈希。我每次接手新的 SD 项目都会先做这张图,能避免至少一半的后期返工。