常见密码算法与签名验签流程

聊签名验签,绕不开密码算法。你想想看,没有扎实的算法基础,做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。做国内合规项目必选。

三、签名验签基本流程

不管用哪种算法,签名验签的核心步骤都一样。我总结了五步走的流程,你照着做基本不出错。

  1. 哈希摘要:对原始消息做哈希运算,输出固定长度摘要。
  2. 私钥签名:用私钥对摘要进行签名运算,得到签名值。
  3. 消息+签名:将原消息和签名值一起发送给验签方。
  4. 提取摘要:验签方对收到的消息做相同哈希运算。
  5. 公钥验签:用公钥验证签名值是否与摘要匹配。

为什么会强调第五步?我在项目中遇到过验签逻辑写反的情况——把签名运算当验签来用,结果全链路的签名验证都通过了,但存在严重安全漏洞。避坑指南:验签必须用公钥,签名必须用私钥,千万别搞混。

下面这张图把流程画清楚了:

签名验签基本流程(以RSA为例) 原始消息 哈希计算(SHA-256) 私钥签名(RSA) 签名值 消息+签名 收到消息 哈希计算(SHA-256) 公钥验签(RSA) 验签结果 注意 私钥签名 ≠ 公钥加密 验签用公钥恢复哈希值 对比摘要是否一致

四、算法对比与选型

说到底,没有完美的算法。选哪个取决于你的安全等级、性能要求和兼容性。我整理了一张对比表,直接照着选就行。

算法 安全强度(位) 签名性能 验签性能 密钥长度 常见场景
RSA-2048 112 慢 快 256字节 CA证书、老旧系统
RSA-3072 128 很慢 较快 384字节 金融、政府
ECDSA P-256 128 快 较快 32字节 区块链、移动端
Ed25519 128 非常快 非常快 32字节 高速签名场景
SM2 128 较快 较快 32字节 国密合规
个人经验:如果是HSM内部做签名优化,优先看验签性能。因为很多业务场景是验签>签名。我之前优化一个支付网关,把RSA换成Ed25519,TPS直接翻倍。

五、实践经验与避坑

聊点实际踩过的坑。先说填充方案。RSA签名用PKCS#1 v1.5时,有个经典漏洞——签名可以伪造。就是因为填充验证不够严格。后来NIST要求必须用PSS。如果系统还在用v1.5,建议尽快升级。

我曾经接手一个系统,用的是最原始的 PKCS#1 v1.5 签名,而且是在嵌入式设备上。消息摘要没加salt和随机数,结果攻击者通过已知签名成功伪造了新签名。幸亏发现得早,否则后果不堪设想。从那以后,我对填充方案特别敏感。

警示:RSA签名必须使用PSS填充方案!别再抱残守缺用v1.5。ECDSA要使用合格的随机数生成器,否则私钥会泄露。

再说一个常见的坑:签名验签中的编码问题。数字签名通常输出的是二进制(DER或BER编码),但很多业务系统用Base64传输。我在一个跨平台项目中,Java签名出来是DER格式,Python端却当成了原始字节流比对,结果验签全失败。解决办法是统一编码规范,用Base64做中间格式。

最后说说哈希算法的选择。签名强度 = 哈希算法安全强度 + 签名算法安全强度。你用SHA-1配RSA-4096,依然会被人轻松破解。建议至少SHA-256起步。如果你的HSM支持SM3,做国内业务时尽量用。