dz_xiaobai
DZ_XIAOBAI
2016-12-24 01:46
采纳率: 0%
浏览 3.1k

如何实现报文的签名和验签

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’, 如相等,则验证正确,否则验证错误。
_

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • zqbnqsdsmd
    zqbnqsdsmd 2016-12-24 01:56

    别硬扛着了,这活还是雇个程序员吧。

    点赞 评论

相关推荐