常见密码算法与签名验签流程
聊签名验签,绕不开密码算法。你想想看,没有扎实的算法基础,做HSM优化就像盖楼没打地基。我个人习惯先把算法分类摸清楚,再谈流程优化。这章我们就把这块掰开揉碎讲。
一、常见密码算法分类
密码算法大体上分三类:对称加密、非对称加密、哈希函数。签名验签主要用非对称和哈希,但对称算法在密钥保护环节也常露面。
| 算法类别 | 典型算法 | 在签名验签中的角色 |
|---|---|---|
| 对称加密 | AES、SM4 | 保护私钥存储、加密会话密钥 |
| 非对称加密 | RSA、ECDSA、EdDSA、SM2 | 签名与验签核心 |
| 哈希函数 | SHA-256、SHA-3、SM3 | 消息摘要生成 |
我记得第一次接触签名系统时,搞混了RSA加密和RSA签名。其实签名用的是私钥加密,验签用的是公钥解密,跟我们日常说的“加密-解密”刚好反过来。这点搞不清楚,后面优化全是白费。
二、数字签名标准算法
目前主流签名算法就那几个,但各有各的脾气。我做HSM优化时最常用的是RSA和ECDSA。RSA老当益壮,兼容性好;ECDSA短密钥高强度,适合移动端。
2.1 RSA签名
RSA签名基于大整数分解难题。签名过程简单说就是:用私钥的模幂运算对哈希值做“解密”。验签则是用公钥做“加密”恢复哈希值再比对。嗯,这里要注意:RSA签名有两种填充方案——PKCS#1 v1.5和PSS。PSS安全性更好,但计算量稍大。
2.2 ECDSA签名
ECDSA基于椭圆曲线离散对数。密钥长度短(256位就能达到RSA 3072的安全级别),签名速度比RSA快。但验签过程需要两次模逆运算,比签名更吃计算资源。这个特性在做HSM吞吐量优化时得特别关注。
2.3 EdDSA签名
EdDSA是比较新的签名算法,典型代表是Ed25519。它采用确定性签名,没有随机数漏洞问题。我在一个区块链项目中推荐过换EdDSA,切换后签名性能提升了3倍。如果你在做新系统选型,可以优先考虑。
2.4 SM2签名
国密标准,基于椭圆曲线。与ECDSA结构类似,但哈希算法用SM3。做国内合规项目必选。
三、签名验签基本流程
不管用哪种算法,签名验签的核心步骤都一样。我总结了五步走的流程,你照着做基本不出错。
- 哈希摘要:对原始消息做哈希运算,输出固定长度摘要。
- 私钥签名:用私钥对摘要进行签名运算,得到签名值。
- 消息+签名:将原消息和签名值一起发送给验签方。
- 提取摘要:验签方对收到的消息做相同哈希运算。
- 公钥验签:用公钥验证签名值是否与摘要匹配。
为什么会强调第五步?我在项目中遇到过验签逻辑写反的情况——把签名运算当验签来用,结果全链路的签名验证都通过了,但存在严重安全漏洞。避坑指南:验签必须用公钥,签名必须用私钥,千万别搞混。
下面这张图把流程画清楚了:
四、算法对比与选型
说到底,没有完美的算法。选哪个取决于你的安全等级、性能要求和兼容性。我整理了一张对比表,直接照着选就行。
| 算法 | 安全强度(位) | 签名性能 | 验签性能 | 密钥长度 | 常见场景 |
|---|---|---|---|---|---|
| RSA-2048 | 112 | 慢 | 快 | 256字节 | CA证书、老旧系统 |
| RSA-3072 | 128 | 很慢 | 较快 | 384字节 | 金融、政府 |
| ECDSA P-256 | 128 | 快 | 较快 | 32字节 | 区块链、移动端 |
| Ed25519 | 128 | 非常快 | 非常快 | 32字节 | 高速签名场景 |
| SM2 | 128 | 较快 | 较快 | 32字节 | 国密合规 |
五、实践经验与避坑
聊点实际踩过的坑。先说填充方案。RSA签名用PKCS#1 v1.5时,有个经典漏洞——签名可以伪造。就是因为填充验证不够严格。后来NIST要求必须用PSS。如果系统还在用v1.5,建议尽快升级。
我曾经接手一个系统,用的是最原始的 PKCS#1 v1.5 签名,而且是在嵌入式设备上。消息摘要没加salt和随机数,结果攻击者通过已知签名成功伪造了新签名。幸亏发现得早,否则后果不堪设想。从那以后,我对填充方案特别敏感。
再说一个常见的坑:签名验签中的编码问题。数字签名通常输出的是二进制(DER或BER编码),但很多业务系统用Base64传输。我在一个跨平台项目中,Java签名出来是DER格式,Python端却当成了原始字节流比对,结果验签全失败。解决办法是统一编码规范,用Base64做中间格式。
最后说说哈希算法的选择。签名强度 = 哈希算法安全强度 + 签名算法安全强度。你用SHA-1配RSA-4096,依然会被人轻松破解。建议至少SHA-256起步。如果你的HSM支持SM3,做国内业务时尽量用。