第2章 加密基础:对称加密与非对称加密、加密模式、填充方式

加密是个老话题了,但每次做API改造都能遇到新坑。这一章我们只聊跟REST显式加密直接相关的几种加密技术。说白了,就是你要懂怎么选算法、怎么配模式、怎么补数据,才能在API里把加密用对。

2.1 对称加密

对称加密,加密和解密用的是同一个密钥。就像你家的防盗门,用同一把钥匙锁上、打开。

常见的对称算法有:

  • AES(高级加密标准)—— 目前主流,密钥长度128/192/256位
  • DES —— 56位密钥,太短了,别用了
  • 3DES —— DES的加强版,但效率低,也在逐步淘汰
  • SM4 —— 国标,国内合规场景必选

我早期做支付接口时图省事用过DES,后来安全审计直接亮了红灯。嗯,从那以后我再也没碰过DES。AES-256是我现在的默认选项。

对称加密的优势:速度快,适合加密大量数据。缺点也明显:密钥怎么安全地传给对方?你想想看,如果密钥在传输中被截了,加密就形同虚设。

2.2 非对称加密

非对称加密有一对密钥:公钥和私钥。公钥可以公开,私钥自己藏好。用公钥加密的数据,只有对应的私钥能解开。

常见算法:

  • RSA —— 应用最广,密钥长度2048位起步
  • ECC(椭圆曲线) —— 同等安全强度下密钥更短,性能更好
  • SM2 —— 国标,基于ECC

我个人习惯在移动端优先选用ECC。为什么?移动端计算资源有限,ECC的密钥更短,握手更快。服务器端用RSA多一些,兼容性更好。

非对称加密解决了密钥分发问题,但速度比对称加密慢两到三个数量级。所以实际项目中,没人直接用RSA去加密几十KB的请求体。

对称加密 vs 非对称加密 — 核心对比 对称加密 🔑 使用同一密钥 加密运算 解密运算 ✅ 加解密速度快 ⚠️ 密钥管理困难 🔒 适合大量数据加密 📦 典型算法:AES、SM4 REST场景:加密请求/响应体 非对称加密 🔑 公钥 / 私钥对 公钥加密 私钥解密 ⚠️ 加解密速度慢 ✅ 密钥管理便捷 🔒 适合少量数据加密 📦 典型算法:RSA、ECC、SM2 REST场景:交换对称密钥 / 签名 REST API 加密实践:对称加密保护数据,非对称加密交换对称密钥

2.3 加密模式

加密模式决定了怎么对数据进行分块加密。选错了模式,就算算法再强,也容易出安全漏洞。

我曾在项目中遇到过ECB模式的问题。当时图省事,直接用了ECB,结果密文里能看出明文的轮廓——同样的明文块产生同样的密文块。安全审计直接给了个高危。嗯,后来老老实实改成了GCM。

模式 是否需要IV 支持并行 带认证 安全性 推荐场景
ECB 否 是 否 低 不推荐,避免使用
CBC 是 否 否 中 文件加密(配合HMAC)
GCM 是 是 是 高 REST API加密(首选)
CTR 是 是 否 高 流式加密(配合HMAC)
我的建议:做REST API加密直接选GCM。它自带认证标签,能同时保证机密性和完整性,省掉额外算HMAC的麻烦。IV用12字节,每次加密随机生成。

2.4 填充方式

块加密算法要求明文长度是块大小的整数倍。AES的块大小是16字节。不是16的倍数怎么办?填充。

常见的填充方式:

  • PKCS7 —— 缺n个字节就填n。最常用,也是我推荐的方式。
  • NoPadding —— 不做填充。要求明文长度刚好是块大小的整数倍。
  • ISO10126 —— 最后一个字节填填充长度,其余填随机数。这个标准已经退役了。
  • ZeroPadding —— 填0x00。注意:如果原始数据末尾就有0x00,解密后无法区分。

我曾经踩过PKCS7的坑。两个系统联调,一个用PKCS7填充,另一个用ZeroPadding。解密出来尾部一堆乱码,排查了半天才发现是填充方式不匹配。你想想看,这种问题在日志里根本看不出,只能逐字节对比。

避坑指南:填充方式必须两端一致。另外,如果你用GCM模式,它内部已经处理了填充,不需要额外指定填充方式。别画蛇添足。

说到这,你会发现对称加密、非对称加密、加密模式、填充方式这四个东西是绑在一起的。选AES-GCM + PKCS7(或直接用GCM内置机制),是我目前在REST API加密项目里的标配。后面章节我会具体讲怎么在API请求里落地这套组合。