加密基础:对称加密、非对称加密、哈希、数字签名

说到API网关的加密集成,咱们得先把底子打牢。加密这玩意儿,说白了就是让数据在传输和存储时,只有该看的人能看懂。我自己最早接触加密是做支付接口,那时候被各种术语绕得晕头转向,后来发现核心就那么几种武器——对称加密、非对称加密、哈希、数字签名。

对称加密:一把钥匙开一把锁

对称加密最简单,加密和解密用同一把密钥。就像你家大门钥匙——自己锁门,自己开门。算法里最常见的就数 AES(Advanced Encryption Standard) 了。

关键指标:AES-256 是目前业界公认的黄金标准。密钥长度256位,暴力破解需要远超宇宙年龄的时间。

但我得提醒你一句——对称加密的弱点也很明显。密钥怎么安全地传给对方?我当年做某个内部系统时,直接把密钥写死在配置文件里,结果被安全审计骂得狗血淋头。对称加密速度快,适合加密大量数据,但密钥分发是永远的痛。

实战建议:在API网关中,对称加密常用于加密请求体或响应体,密钥通常通过非对称加密的方式来交换。千万别硬编码!

非对称加密:公钥私钥各司其职

非对称加密来了,它解决了密钥分发的难题。一对钥匙:公钥随便发,私钥自己藏。你用我的公钥加密数据,只有我的私钥能解开。反过来,我用私钥签名,你用公钥验证签名。

常见的算法有 RSA 和 ECC(椭圆曲线加密)。RSA 很成熟,但密钥越长性能越差;ECC 用更短的密钥达到同等安全强度——256位的ECC相当于3072位的RSA。

特性 RSA-2048 ECC-256(P-256)
密钥长度 2048 bits 256 bits
安全强度 约112 bits 约128 bits
加密/签名速度 较慢(尤其解密) 快
API网关适用场景 兼容性要求高的环境 移动端/性能敏感场景

避坑指南:我曾经在网关里混用RSA密钥对做签名验证时,没注意公钥格式是PEM还是DER,结果线上签名验证失败,排查了一下午。记住——密钥格式、填充模式(如OAEP vs PKCS#1 v1.5)必须严格对齐。

哈希:单向的指纹

哈希不是加密,它不可逆。你把任意长度的数据扔进去,吐出一个固定长度的摘要。就像给文件打指纹——哪怕只改一个比特,指纹全变。

  • MD5:128位,已经被撞库攻破,别再用。
  • SHA-1:160位,谷歌已经做过碰撞演示,淘汰。
  • SHA-256 / SHA-3:512位,目前安全可靠,API网关里的签名哈希基本用它们。

我在项目中经常用哈希做两件事:验证数据完整性(下载文件校验哈希)、和密码存储(加盐哈希)。但哈希本身不提供身份认证——任何人拿到数据都能计算哈希,所以需要跟数字签名搭配。

数字签名:谁说这是你写的?

数字签名 = 哈希 + 非对称加密。步骤很简单:

  1. 发送方对消息做哈希,得到摘要
  2. 用私钥加密这个摘要,得到签名
  3. 接收方用公钥解密签名,得到摘要A
  4. 对收到的消息重新计算哈希,得到摘要B
  5. 比较A和B,一致则验签通过

这玩意儿在API网关里无处不在。比如JWT的签名部分,就是按这个流程来的。我调试过一个案例:客户端传的JWT明明在自己机器上验证通过,到网关就报签名无效。最后发现是字符编码问题——JSON序列化时字段顺序不一致,导致签名前的载荷字节流不同。开源库通常做了规范,但你手拼签名时一定要小心规范化。

整张知识地图

这些基础概念不是孤立的。我画了一张图帮你建立整体认知,你看看它们的定位和关系:

加密基础概念关系图 对称加密 AES, ChaCha20 非对称加密 RSA, ECC 哈希函数 SHA-256, SHA-3 数字签名 哈希 + 非对称加密 可交换密钥 提供公钥 提供摘要 ⚠ 核心概念关系 对称加密快但密钥难分发 → 非对称加密解决分发 → 哈希保证完整性 → 数字签名结合三者实现身份认证 API网关中通常同时用到这几种技术做TLS握手、JWT签名、请求验签 速度最快 密钥协商 不可逆

在实践中如何选择

在API网关里,你不会孤立使用其中一种。实际场景往往是混合的:

一个典型场景:客户端用HTTPs(TLS握手时用非对称加密交换对称密钥),然后使用对称加密(AES-GCM)加密API请求体,最后对整个请求用客户端私钥签名,网关用公钥验签。四件套全用上了。

我个人习惯在网关层统一使用ECDSA-P256做签名算法,因为它比RSA快,而且密钥短。但注意兼容性——有些老旧客户端不支持ECC,你可能会需要降级到RSA。嗯,这里有个经验:提前在网关配置里做算法协商列表,不要硬编码。

写在最后

加密不是魔法,是组合使用的基础设施。你把对称加密、非对称加密、哈希、数字签名这四样理解透了,后面讲TLS、JWT、API签名等就顺理成章。记住一条底线:不要自己造算法,用标准库和成熟算法。我在刚入行时差点手写了一个“加密算法”,现在想起来后背发凉——你能想到的漏洞,前人已经倒在坑里了。