【问题标题】:How to sign xml element using RSA-SHA1 algorithm?如何使用 RSA-SHA1 算法对 xml 元素进行签名?
【发布时间】:2017-09-06 12:05:29
【问题描述】:

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

RSA-SHA1 网址:
http://www.w3.org/2000/09/xmldsig#rsa-sha1
指定于:
[XMLDSIG-CORE2002] 的第 6.4.2 节

我关注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 值无效。

【问题讨论】:

    标签: c# .net xml cryptography digital-signature


    【解决方案1】:

    在 .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.SignedInfo.SignatureMethod 设置为SignedXml.XmlDsigSHA256Url 或更好。


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

    【讨论】:

    • @user5226582 啊,SignedXml.SignatureMethod 是可写 SignedXml.SignatureInfo.SignatureMethod 的只读投影。修正了答案。
    • @bartonjs,它不应该为reference.DigestMethod = SignedXml.XmlDsigSHA1Url 提供第三个“c”项吗?或者,对于所有类型的 SHA-1 XML 签名来说,这一步真的不是必需的吗?
    • @PedroGaspar 如果您想要全 SHA-1,那么可以。但是引用的摘要和签名中使用的摘要不需要匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2017-07-30
    • 2013-06-06
    • 2019-11-19
    • 1970-01-01
    • 2019-08-24
    • 2012-02-18
    相关资源
    最近更新 更多