XML数字签名实现原理是“先规范、再摘要、最后加密”:先通过Canonicalization消除XML等价写法差异,再对规范化数据及SignedInfo分别计算摘要,最后用私钥签名SignedInfo摘要,验证时比对解密结果与重算摘要及各Reference的DigestValue。

XML数字签名(XMLDSig)的实现原理,核心是“先规范、再摘要、最后加密”,三步缺一不可。它不是简单地把整个XML文件当二进制流来签名,而是针对语义内容做精准保护——哪怕格式微调(比如换行、属性顺序变化),只要逻辑没变,签名依然有效。
规范化(Canonicalization)是前提
XML在不同系统中可能有多种等价写法:空格多一个、命名空间前缀不同、属性顺序调换……这些都不影响解析结果,但会导致哈希值完全不同。所以XMLDSig强制要求先做规范化处理,把原始XML转换成唯一、标准的字节流。常用算法是Canonical XML 1.0或Exclusive Canonicalization。这一步决定了后续所有计算的基础是否一致。
- 规范化对象不只是整个文档,也可以是某个
指向的特定元素或片段 - 必须在签名生成和验证两个阶段使用完全相同的规范化方法,否则必然失败
- 很多签名失败问题,根源就在两端用的规范化算法不匹配
摘要计算(Digest)是内容指纹
对规范化后的数据(比如某个元素的字节流),用SHA-256、SHA-512等哈希算法算出固定长度的摘要值(DigestValue)。这个值就像内容的“数字指纹”——极小改动就会让指纹彻底改变。
- 每个
可独立指定自己的摘要算法和摘要值 - 摘要值明文记录在
里,供验证方比对 - 整个
块本身也要被规范化并摘要,用于最终签名
签名生成与验证靠非对称加密
规范化后的字节流,用签名者的私钥加密(或执行签名运算),生成。验证时,用对应的公钥解密该值,得到原始摘要,再和本地重新计算的摘要比对。
- 签名算法常见有
RSA-SHA256、ECDSA-SHA256等,需在中明确声明 - 公钥信息可通过
内嵌X.509证书,也可由外部信任体系提供 - 验证成功 =
解密结果 == 本地重算的摘要,且所有的也都匹配
基本上就这些。不复杂但容易忽略细节,尤其是规范化和算法一致性。










