本文目录导读:

数字签名验证过程的核心目的是确认消息的完整性和来源的真实性,这个过程依赖于公钥密码学(非对称加密),通常涉及哈希函数和公钥/私钥对。
下面以最常用的方法——“先哈希,后签名”为例,详细拆解验证步骤。
前提假设
- 发送方(签名者)拥有:
- 私钥:严格保密,用于签名。
- 公钥:公开,分发给所有接收方。
- 验证者拥有:
- 发送方的公钥(通过可信渠道获得,如CA证书)。
- 接收到的原始消息
M。 - 接收到的数字签名
S。
验证过程四步走
假设发送方已经使用其私钥 K_priv 对消息 M 生成了签名 S,并将 (M, S) 一起发送,验证者现在要做以下事情:
第一步:计算消息摘要
验证者使用与发送方相同的哈希函数(SHA-256),对接收到的原始消息 M 进行哈希运算,生成一个定长的“消息摘要” H'。
H' = Hash(M)
- 目的:将任意长度的消息压缩成一个固定长度的“指纹”,这一步确保了消息的任何微小改动都会导致
H'完全不同。
第二步:解密签名
验证者使用发送方的公钥 K_pub 对接收到的数字签名 S 进行解密运算。
- 这个解密过程对应着签名创建时的加密过程,由于签名是发送方用其私钥加密消息摘要生成的,所以用公钥解密就能还原出原始的摘要值,记为
H。
H = Decrypt(K_pub, S)
- 注意:在标准算法(如 RSA)中,这是解密,在椭圆曲线签名算法(如 ECDSA, EdDSA)中,这是一个验证方程求解,但逻辑上等价于“提取出签名中蕴含的原始哈希值”。
第三步:比较两个摘要
验证者将第一步计算出的摘要 H' 与第二步解密出的摘要 H 进行比较。
比较 H' 是否等于 H?
第四步:得出结论
-
H' == H=> 验证成功- 证明来源真实性:因为签名
S是用私钥加密的,而只有对应的公钥能解密成功,能成功解密,说明该签名必然是由持有该私钥的唯一实体(发送方)创建的,不可抵赖。 - 证明消息完整性:因为
H'(从收到的消息算出)和H(从签名中解出)完全一致,说明消息在传输过程中没有被篡改。
- 证明来源真实性:因为签名
-
H' != H=> 验证失败- 可能原因:
- 消息被篡改:收到的消息
M与签名时不同。 - 签名被伪造:签名不是用对应私钥生成的。
- 公钥错误:使用的公钥与签名用的私钥不匹配。
- 哈希算法不一致:发送方和接收方用了不同的哈希函数(这种情况应被协议避免)。
- 消息被篡改:收到的消息
- 可能原因:
完整流程图
发送方(已发送消息M和签名S) 验证方(收到M和S)
| |
| | 1. 计算消息摘要
| | H' = Hash(收到的M)
| |
| | 2. 解密签名
| -------- 公钥 K_pub --------> | H = Decrypt(K_pub, 收到的S)
| |
| | 3. 比较两个哈希
| | H' ?= H
| |
| | 4. 输出结果
| | True (成功) 或 False (失败)
- 工作流程:哈希 + 非对称加解密,哈希解决长度和效率问题,非对称加密提供身份认证。
- 验证关键:用公钥能解密成功,且解密出的内容与消息的哈希一致。
- 安全基石:私钥的安全性,任何人只要拿到私钥,就能伪造签名。
- 常见算法:RSA(通常配合 SHA-256),DSA,ECDSA(如比特币、TLS证书使用),EdDSA(如Ed25519,现代更安全高效的算法)。
这个验证过程是数字证书(如SSL/TLS证书)、软件签名、电子合同、区块链交易等几乎所有现代安全系统的核心基础。