1.1 报文签名验签
报文签名采用标准XML文件格式格式(参照W3C标准)。
1.2 数据签名
从xml报文中,取指定节点数据(带有标签,不带命名空间),直接拼接后形成待签名数据源,然后再进行签名。
数据签名采用标准的PKCS#1格式。
数字签名前要对源数据使用SHA-1数据摘要算法作HASH运算,再用签名私钥作RSA运算,结果即为对数据的“数字签名”。下面记DATA为待签名数据, SHA(…)为HASH函数,RSA(…)为RSA运算函数,SIGN为签名结果。数字签名过程为:_
(1) 用SHA-1摘要算法对需要签名的数据(DATA)进行HASH运算,生成20字节HASH结果:
H = SHA(DATA) H为20字节
(2) 按PKCS#1标准对HASH结果作填充
B = 00 01 00 ff ff … ff 00
30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14
H[00], H[01], …, H13 使用私钥(记作pvk)对填充后的数据块作RSA运算,生成128字节签名结果:
SIGN = RSApvk(B) SIGN为128字节
(4) 将签名结果(128字节)进行Base64转换,生成172字节签名结果串。
(5) 172字节签名结果串即为签名结果。
1.3 数据验签
从xml报文中,取指定节点数据(带有标签,不带命名空间),直接拼接后形成验签数据源,从报文中取签名结果。
接收方根据接收报文中的签名者信息(SignerID、KeyName),查找对应的证书及公钥,然后使用该公钥对签名进行验证。
从接收报文中取签名结果,记为SIGN,签名原数据为DATA,验签公钥为pbk,则验证签名的流程为:
_(1) 将Base64格式的签名结果串转换为128字节二进制数据。
(2) 使用公钥对签名结果作RSA公钥解密运算并去掉填充:
H’ = RSApbk(SIGN)
(3) 对签名原数据作HASH运算:
H = SHA(DATA)
(4) 比较H与H’, 如相等,则验证正确,否则验证错误。
_