【问题标题】:.Net 4.0 C# When loading SHA256 key SignatureAlgorithm changes to SHA1.Net 4.0 C# 加载 SHA256 密钥时 SignatureAlgorithm 更改为 SHA1
【发布时间】:2015-06-03 20:30:46
【问题描述】:

我现在整整一个星期都在努力解决这个问题,希望有人可以帮助我。

我需要使用 SHA256 和 xmldsig 对 xml 进行签名。 为此,我使用 SignedXML 类。在查看此类时,我发现它使用加载键的 SignatureAlgorithm 值来确定要使用的哈希类型。

无论我如何加载密钥(通过证书存储或通过加载证书文件),它都会将 SHA1 显示为 SignatureAlgorithm。 当我在 MMC 证书存储中查找我的证书的详细信息时,它显示 SHA256 作为 SignatureAlgorithm。

我尝试使用 openssl 和 makecert 来生成 SHA256 证书密钥,但两者都将在 .Net 中加载为 SHA1 所以signedXml.ComputeSignature();将使用 SHA1 作为 SignatureMethod

.Net 4.0 应该支持 SHA256 吧?

【问题讨论】:

标签: c# .net sha256 signedxml xml-dsig


【解决方案1】:

发现我可能使用了错误的类。

应该使用 System.Security.Cryptography.Xml.SignedXml 而不是 Microsoft.Web.Services.Security.SignedXml。 后者不使用已用密钥的 SignatureAlgorithm 来确定要使用的算法。 现在我可以自己使用“SignedXml.SignedInfo.SignatureMethod”设置算法并使用 SHA1 密钥。

【讨论】:

    【解决方案2】:

    您必须声明一个KeyedHashAlgorithm 对象并传递一个对应于SHA256 的字符串(文档here)。

    SHA256 对应的字符串是HMACSHA256

    然后将此对象传递给ComputeSignature 方法。

    代码如下:
    KeyedHashAlgorithm kha = KeyedHashAlgorithm.Create("HMACSHA256"); signedXml.ComputeSignature(kha);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 2013-03-21
      相关资源
      最近更新 更多