如何使用 RSA-SHA1 算法对 xml 元素进行签名?

How to sign xml element using RSA-SHA1 algorithm?

我需要使用 RSA-SHA1 算法签署(并最终验证)XML 文档的其中一个节点。 w3.org link

RSA-SHA1 URI:
http://www.w3.org/2000/09/xmldsig#rsa-sha1
Specified in:
section 6.4.2 of [XMLDSIG-CORE2002]

我正在关注 this example,但不知道如何将算法更改为必需的。

签名生成发生在此处:

signedXml.ComputeSignature();

唯一带有参数的覆盖需要 KeyedHashAlgorithm:

public void ComputeSignature(KeyedHashAlgorithm macAlg); (link)

KeyedHashAlgorithm (link) 反过来只允许创建 HMAC* 和 MAC* 算法并且没有 RSA-SHA1.

在 .Net 中使用 RSA-SHA1 签署 XML 最轻松的方法是什么?

编辑:

我正在尝试使用 X509 证书来提取密钥。证书的签名算法 属性 是 sha1RSA.

这就是我分配它的方式:

var signedXml = new SignedXml(xmlDoc);
...
signedXml.SigningKey = (RSACryptoServiceProvider)cert.PrivateKey;
...
signedXml.ComputeSignature();

生成的签名 xml 格式符合预期格式,但是 digestsignature 值无效。

在 .NET Framework 1.1 到 .NET Framework 4.7 中,您只需将 signedXml.SigningKey 设置为 RSA 密钥对象即可获得 RSA-SHA-1。

如果安装了 .NET 4.7.1(当前为预览版),根据 https://github.com/Microsoft/dotnet/blob/master/releases/net471/dotnet471-changes.md.

,RSA 的默认值将更改为 RSA-SHA-2-256

所以,如果你真的想要一个 RSA-SHA-1 签名,你需要

a) 将 signedXml.SigningKey 设置为 RSA 密钥

b) 设置 signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url

(均在调用 signedXml.ComputeSignature() 之前)

相反,如果您想在当前版本上做一些比 RSA-SHA-1 更好的事情,请将 signedXml.SignedInfo.SignatureMethod 设置为 SignedXml.XmlDsigSHA256Url 或更好。


警告词:鉴于已发现冲突,SHA-1 出于加密目的被认为已损坏。虽然它还不够泛化(在这一点上)来攻击任意 XML,但它很可能会发展到这一点。您真的不应该在任何新事物中使用 SHA-1,并且在决定是否接受签名文档时应该考虑验证您的签名方法是否比基于 SHA-1 的方法更好。