use*_*582 2 .net c# xml cryptography digital-signature
我需要使用RSA-SHA1算法签署(并最终验证)XML文档的一个节点.w3.org链接
RSA-SHA1 URI:
http://www.w3.org/2000/09/xmldsig#rsa-sha1
指定于:
[XMLDSIG-CORE2002]的第6.4.2节
我正在关注这个例子,但无法想出如何将算法更改为所需.
签名生成发生在这里:
signedXml.ComputeSignature();
Run Code Online (Sandbox Code Playgroud)
带参数的唯一覆盖期望KeyedHashAlgorithm:
public void ComputeSignature(KeyedHashAlgorithm macAlg);(链接)
KeyedHashAlgorithm(链接)反过来只允许创建HMAC*和MAC*算法,并且没有RSA-SHA1.
在.Net中使用RSA-SHA1签署XML的最简单方法是什么?
编辑:
我正在尝试使用X509证书来提取密钥.证书的签名算法属性是sha1RSA.
这是我分配它的方式:
var signedXml = new SignedXml(xmlDoc);
...
signedXml.SigningKey = (RSACryptoServiceProvider)cert.PrivateKey;
...
signedXml.ComputeSignature();
Run Code Online (Sandbox Code Playgroud)
将得到的签名XML格式一致预期的一个,但digest和signature值无效.
在.NET Framework 1.1到.NET Framework 4.7中,只需设置signedXml.SigningKey为RSA密钥对象即可获得RSA-SHA-1 .
如果安装了.NET 4.7.1(当前处于预览状态),则RSA的默认值将更改为RSA-SHA-2-256,按照https://github.com/Microsoft/dotnet/blob/master/releases/net471/dotnet471 -changes.md.
所以,如果你真的想要一个RSA-SHA-1签名,你需要
a)设置signedXml.SigningKey为RSA密钥
b)设定 signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url
(都在打电话之前signedXml.ComputeSignature())
相反,如果您想在当前版本上执行比RSA-SHA-1 SignedXml.XmlDsigSHA256Url更好的操作,请将signedXml.SignedInfo.SignatureMethod设置为或更好.
警告提示:由于已发现冲突,因此在加密时会将SHA-1视为已损坏.虽然它没有足够的概括(此时)来攻击任意XML,但它可能会长大到那一点.你真的不应该在任何新东西中使用SHA-1,并且应该考虑在决定是否接受签名文档时验证你的签名方法比SHA-1更好.