2. 加密基础理论:对称加密、非对称加密、哈希算法

做对象存储 SDK 加密参数调优之前,得先把加密本身搞明白。不夸张地说,我见过不少开发者在 AES 密钥长度上调了半天,结果问题出在哈希碰撞上。所以这一章我们老老实实过一遍三大加密家族的原理和适用场景。

2.1 对称加密:又快又简单,但密钥怎么给?

对称加密,说白了就是加密和解密用同一把钥匙。就像你家里大门锁,你拿钥匙锁上,回来再拿同一把钥匙打开。算法包括 AES、DES、3DES、SM4 等,目前业界主流是 AES-256-GCM。

核心流程:

  1. 发送方生成一个随机密钥(Key)和初始向量(IV)。
  2. 发送方用 Key + IV 对明文加密,得到密文。
  3. 接收方拿到同样的 Key + IV,才能正确解密。

我个人的习惯:永远不要用 ECB 模式。我在项目里踩过坑——用 AES-ECB 加密了一组图片,结果同一区域的像素块完全暴露了图片结构。后来换成 GCM,带认证加密,安全性和性能都兼顾了。

常见算法对比:

算法密钥长度安全等级推荐场景
AES-128-GCM128 bit高移动端、IoT 设备
AES-256-GCM256 bit极高服务端、对象存储大文件
SM4128 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-20482048 bit高慢(约 1000 倍于 AES)
ECC-P256256 bit极高(等效 RSA-3072)快
SM2256 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

应用场景:

  1. 文件完整性校验:上传对象时附带哈希值,下载后验证是否被篡改。
  2. 密码存储:用户密码需要加盐后做哈希,不能明文存储。
  3. 数字签名:对哈希值签名,而非对原文签名。
  4. 数据去重:对象存储里常用哈希作为分块指纹。

我遇到过的一个典型问题:某客户用 MD5 做对象存储的 ETag 校验,结果两个不同文件碰巧 MD5 相同,导致覆盖了正确数据。嗯,从那以后我对没加盐的 MD5 就深恶痛绝了。

2.4 三者如何协作?

实际系统中,三种加密技术往往是组合使用的。比如一个安全的对象上传流程:

  • 客户端生成随机 AES Key,用对称加密加密文件内容(速度快)。
  • 用服务端公钥(RSA/ECC)加密这个 AES Key,附带在请求中。
  • 对整个请求(密文+加密密钥)计算 SHA-256 哈希,作为完整性校验。

这就是现代加密体系的典型分工:对称加密管大数据量的加密速度,非对称加密管密钥的安全分发,哈希算法管数据完整性验证。

注意:哈希算法不要和加密混为一谈。我在代码评审里看到过有人把密码用 SHA-256 哈希后当作“加密”,然后试图解出原文,这是不可能的。哈希是不可逆的,请牢记。

加密基础理论 · 三大技术体系 对称加密 非对称加密 哈希算法 密钥相同,加解密速度极快 典型:AES-256-GCM 场景:对象存储加密 公钥加密,私钥解密 典型:ECC P-256 / RSA-2048 场景:密钥交换、数字签名 不可逆,固定长度摘要 典型:SHA-256 / SM3 场景:完整性校验、密码存储 典型协作流程(对象存储上传) 对称加密→加密文件内容 | 非对称加密→传输密钥 | 哈希算法→校验完整性

2.5 小结:选哪个?何时用?

你想想看,实际调优的时候,第一步是确定 加密用途:

  • 要加密大量数据 → 对称加密(AES-256-GCM)
  • 要安全交换密钥 → 非对称加密(ECC P-256)
  • 要检测数据是否被篡改 → 哈希(SHA-256)
  • 要存密码 → 哈希加盐(bcrypt / Argon2)

很多云厂商的对象存储 SDK 默认采用 AES-256 加密,同时支持用户提供自己的密钥(SSE-C)。这时候你只需要关心密钥的管理和轮换策略,加密算法本身已经经过行业验证了。

一个小建议:在开始调优之前,先在纸上画出你当前系统的数据流,标出哪里用对称、哪里用非对称、哪里用了哈希。我每次接手新的 SD 项目都会先做这张图,能避免至少一半的后期返工。