签名问题

qq_37810333 2018-04-16 06:28:14
我签名完了没有ds前缀什么原因?大神帮忙看看

我的签名:
<MessageSuit><Message id="355010000172201804161131"><Plain id="FCReq"><version>1.0.1</version><transId>FCReq</transId><merId>355010000172</merId><stages>1003</stages><amount>0.01</amount><currency>156</currency></Plain></Message><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI="#FCReq"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>Iq5k121poJVvYzs8OPxs3+X3xGU=</DigestValue></Reference></SignedInfo><SignatureValue>pl5AJ2KLqv4LQAq23VCzMOI4c7Yja+9rxXk+VItL3wKQeCAnEgRQvAkYigvsemA08TYF5To/PX2C
ERLdDUfQnKOOs+1s1NLG3qRS97VeMswddkKTC+2AHQkVymyi986xxZAKFrSsXAGzBiDBXFD1iW7j
7wThQGszM5GIqLr9f5E=</SignatureValue></Signature></MessageSuit>
正确签名:
<MessageSuit><Message id=""><Plain id="FCReq"><version>1.0.1</version><transId>FCReq</transId><merId>355010000172</merId><stages>1003</stages><amount>0.01</amount><currency>156</currency></Plain><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></ds:SignatureMethod>
<ds:Reference URI="#FCReq">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod>
<ds:DigestValue>Iq5k121poJVvYzs8OPxs3+X3xGU=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
SNPUMrwiqxVBbO38Oft+wHcEQh0ySLhNlKZvNDq2DhTYEtKhI666YSg+U8bkA8euYBoF75grCSHz
sroSHmWOOQYd6xGJ5LlraJssEWWgX2UkE2XpH3rUdVUclCPX0xWplQwsZp+GtWcXumrUb1GXl2yv
4HFUgYMyI6zbr0I60rY=
</ds:SignatureValue>
</ds:Signature></Message></MessageSuit>

我的代码:
/// <summary>
/// xml报文签名
/// </summary>
/// <param name="xmlDoc">xml 的文档对象</param>
/// <param name="key">商户私钥</param>
/// <param name="uri">资源指定位置</param>
/// <returns>签名后字符串</returns>
private string signXml(XmlDocument xmlDoc, RSA key, string uri)
{
//创建xml签名对象
SignedXml signedXml = new SignedXml(xmlDoc);
//指定私钥
signedXml.SigningKey = key;
//指定标准化:http://www.w3.org/TR/2001/REC-xml-c14n-20010315
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigC14NTransformUrl;
//指定签名方法:rsa-sha1
signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url;
//设置keyInfo为null
signedXml.KeyInfo = null;
//创建引用对象
Reference reference = new Reference();
reference.Uri = "#" + uri;
//指定Signature标签与原xml报文的组装方式:enveloped
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
//向签名对象中添加引用
signedXml.AddReference(reference);

try
{
//计算数字签名
signedXml.ComputeSignature();
}
catch (CryptographicException e)
{
//uri不正确
throw new System.ArgumentException("E0008:签名使用的uri不正确,商户上送uri为:" + uri);
}

//获取签名后的xml
XmlElement xmlDigitalSignature = signedXml.GetXml();
//把签名加入到文档中
xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
//获取SignatureValue标签的值,然后每76个字节增加一个换行
string signatureValue = xmlDoc.GetElementsByTagName("SignatureValue").Item(0).InnerText;
//设置xml文档中的SignatureValue标签的值
xmlDoc.GetElementsByTagName("SignatureValue").Item(0).InnerText = splitPer76AddLineBreak(signatureValue);

return xmlDoc.OuterXml;
}
...全文
564 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_37810333 2018-04-17
  • 打赏
  • 举报
回复
自己顶一下,别沉啊,大神帮忙看看
qq_37810333 2018-04-16
  • 打赏
  • 举报
回复
尝试添加此属性 xmlns:ds =“http://www.w3.org/2000/09/xmldsig#”添加到XML文档的根标记 上面方法默认添加了xmlns没有ds

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧