1. 签名验签基础回顾:对称与非对称加密、哈希函数、数字签名原理、RSA/ECDSA算法简介
各位同学,咱们今天先不急着调优。做性能优化,最怕的就是基础不牢。你连签名是怎么算出来的都不知道,谈何优化?
这一章,我带大家快速过一遍签名验签的底层逻辑。我自己的习惯是,每接触一个新系统,第一件事就是画一张「数据流+算法」的草图。咱们今天也这么干。
核心观点:数字签名不是「加密」,而是「防抵赖+完整性校验」的联合体。理解这一点,后面所有优化策略才有方向。
1.1 对称加密 vs 非对称加密
先聊加密。说白了,加密就是让数据变得「谁也看不懂」,只有持有钥匙的人才能恢复。
对称加密,加密和解密用同一把钥匙。就像你家的门锁,钥匙只有一把,开门关门都用它。优点是快,非常快。AES-128 在硬件加速下,每秒能处理几十个 G 的数据。缺点也明显——钥匙怎么安全地交给对方?
非对称加密,用一对钥匙:公钥和私钥。公钥公开,私钥自己藏好。你用我的公钥加密,只有我的私钥能解开。反过来,我用私钥加密,大家用我的公钥验证。这个「反过来」的操作,就是数字签名的雏形。
我当年在做一个金融报文系统时,遇到过一个问题:业务方坚持用 RSA 加密所有报文,结果单笔交易耗时从 2ms 飙升到 80ms。后来我们改成「对称加密传输数据 + 非对称加密传输对称密钥」的混合方案,性能才回到正常水平。这个教训让我记住了:非对称加密很慢,别滥用。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1 个(共享密钥) | 2 个(公钥 + 私钥) |
| 典型算法 | AES, DES, SM4 | RSA, ECDSA, SM2 |
| 运算速度 | 极快(硬件加速可达 10+ Gbps) | 慢(RSA-2048 签名约 1-2 万次/秒) |
| 主要用途 | 大数据量加密 | 密钥交换、数字签名 |
| 密钥分发 | 困难(需要安全通道) | 容易(公钥可公开) |
我的建议:做性能优化时,先看场景里有没有「非对称加密被用于加密大数据」的情况。如果有,改成混合加密,通常能带来 10 倍以上的提升。
1.2 哈希函数——数字签名的「压缩器」
数字签名为什么不直接签原文?你想想看,RSA 签名一次,处理的数据量受密钥长度限制。RSA-2048 一次只能签 256 字节。如果原文是 1MB 的 PDF,难道要切分成 4000 块分别签名?那性能就崩了。
所以,哈希函数登场了。它把任意长度的数据,压缩成一个固定长度的「摘要」。比如 SHA-256,输出永远是 32 字节。然后我们只对这个 32 字节的摘要签名。
哈希函数有几个关键特性:
- 单向性:从摘要反推原文,理论上不可能。嗯,除了暴力穷举。
- 抗碰撞性:很难找到两个不同的原文,产生相同的摘要。SHA-1 已经被攻破了,别用了。
- 雪崩效应:原文改一个 bit,摘要完全变样。
我在项目中见过一个坑:有人用 MD5 做签名前的哈希,理由是「快」。结果被安全审计直接打回。MD5 的抗碰撞性已经形同虚设,攻击者可以构造两个不同文件但 MD5 相同,然后让你签一个无害的,实际用的是另一个恶意文件。所以,生产环境至少用 SHA-256。
避坑指南:我曾经接手过一个遗留系统,签名哈希用的是 SHA-1。当时 SHA-1 已经被 Chrome 标记为不安全,但业务方觉得「内部系统没事」。结果第三年合规审查时,被要求全部升级到 SHA-256。那一次改造涉及 12 个微服务,改了整整两个月。所以,新系统直接上 SHA-256 或 SM3,别给自己挖坑。
1.3 数字签名原理——一张图说清楚
咱们直接看流程。下面这张图,是我每次培训必画的。你把它记在脑子里,后面所有优化策略都围绕它展开。
流程其实就三步:
- 签名方:原文 → 哈希 → 摘要 → 用私钥对摘要加密 → 得到签名值。把「原文 + 签名值」一起发出去。
- 验签方:收到后,对原文做同样的哈希,得到摘要1。然后用公钥解密签名值,得到摘要2。
- 比较:摘要1 == 摘要2?相等,说明原文没被改,且确实是私钥持有者签的。
这里有个细节:RSA 签名本质上是「私钥加密,公钥解密」。但 ECDSA 不是这样,它用的是椭圆曲线上的点乘运算,没有「加密/解密」的概念。不过从流程上看,都是「私钥生成签名,公钥验证签名」,理解这个就够了。
1.4 RSA 与 ECDSA 算法简介
这两个是目前最主流的签名算法。咱们对比着看。
RSA
RSA 基于大整数分解难题。给你两个大素数 p 和 q,乘起来得到 n 很容易,但给你 n 反推出 p 和 q,难。RSA 的密钥越长越安全,但性能也越差。
- 签名速度:RSA-2048 签名约 1-2 万次/秒(单核)。验签比签名快,因为公钥指数通常选 65537,计算量小。
- 密钥长度:2048 位是当前最低标准,4096 位更安全但更慢。
- 特点:算法成熟,硬件支持广泛。几乎所有安全芯片、HSM 都支持 RSA。
ECDSA
ECDSA 基于椭圆曲线离散对数难题。同样安全强度下,密钥比 RSA 短得多。比如 256 位的 ECDSA 安全性相当于 3072 位的 RSA。
- 签名速度:ECDSA 签名比 RSA 快 2-5 倍,但验签比 RSA 慢。因为验签需要做两次点乘运算。
- 密钥长度:256 位(P-256 曲线)是主流,安全性对标 RSA-3072。
- 特点:密钥短,签名值也短(64 字节 vs RSA 的 256 字节)。适合带宽敏感的场景。
| 对比维度 | RSA-2048 | ECDSA P-256 |
|---|---|---|
| 安全强度 | 112 位 | 128 位 |
| 密钥长度 | 2048 位 | 256 位 |
| 签名值长度 | 256 字节 | 64 字节 |
| 签名速度 | 慢(约 1-2 万次/秒) | 快(约 5-10 万次/秒) |
| 验签速度 | 快(约 5-10 万次/秒) | 慢(约 2-4 万次/秒) |
| 硬件支持 | 非常广泛 | 广泛(但部分老旧设备不支持) |
| 典型场景 | 兼容性要求高的系统 | 高性能、低带宽场景 |
我的选择建议:如果系统需要大量签名(比如每秒几万次),优先考虑 ECDSA。如果系统需要大量验签(比如网关验签),RSA 反而更快。没有绝对的优劣,只有场景的匹配。
1.5 本章小结
好了,基础部分就到这里。咱们回顾一下关键点:
- 对称加密快,非对称加密慢,混合加密是工程标配。
- 哈希函数是签名的前置步骤,选 SHA-256 或 SM3,别用 MD5/SHA-1。
- 数字签名 = 哈希 + 非对称加密,核心目的是防抵赖和完整性校验。
- RSA 签名慢验签快,ECDSA 签名快验签慢,选型看场景。