如何使用RSA-SHA1算法签署xml元素?

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格式一致预期的一个,但digestsignature值无效.

bar*_*njs 9

在.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更好.