【发布时间】:2018-01-05 00:57:48
【问题描述】:
这是一个奇怪的问题,但我会尝试。
我使用目标框架 4.5.2 开始我的项目,要求是使用 SHA1 算法签署 XML 文件。我使用了这个 MSDN 页面中的示例,效果很好:
SignedXml.CheckSignature 方法 (X509Certificate2, Boolean) -> 示例部分
https://msdn.microsoft.com/en-us/library/ms148731(v=vs.110).aspx#Anchor_3
之后,要求改为 SHA256 算法。我使用那些页面中的代码来修改原始代码,并且效果很好,那时我使用 4.6 作为目标框架:
将 SHA256 与 SignedXml 类一起使用
https://blogs.msdn.microsoft.com/winsdk/2015/11/14/using-sha256-with-the-signedxml-class/.net Framework 4.6.2 增加了对使用 RSA-SHA256 签署 XML 文档的支持
https://www.stum.de/2016/05/19/net-framework-4-6-2-adds-support-to-sign-xml-documents-using-rsa-sha256/
然后我发现 4.6.2 版框架添加了对 SHA256 的完全支持,并且不再需要 CryptoConfig.AddAlgorithm() 调用。我将项目更改为 4.6.2 版,进行了所需的更改,注释了 CryptoConfig.AddAlgorithm() 调用,它工作得很好。
但是现在我们有另一个需求变化:我们希望我们的软件在 Windows XP 下运行(是的,我们确实有用户仍在使用它),并且最后一个可以在 XP (SP3) 上运行的框架版本是 v4.0。因此,我需要测试使用 SHA256 签署 XML 文件是否适用于框架 4.0。
然后我将目标框架更改为 v4.0 并开始更改。我在 CryptoConfig.AddAlgorithm() 调用中使用的 RSAPKCS1SHA256SignatureDescription 类仅从框架 4.5 开始可用,因此我必须编写自己的版本,正如我在某些网页中看到的那样。
但是,现在奇怪了。我保留了 CryptoConfig.AddAlgorithm() 调用的注释以查看会发生什么,因此我可以编写自定义类,但是,它只是工作!
我认为 CryptoConfig.AddAlgorithm() 已经在项目的某处或我的机器中注册了算法。我对此进行了研究,但一无所获。所以我在另一台机器上尝试了,它也可以工作,但是那台机器之前可能已经执行过之前的代码,所以它也可以注册算法。我尝试了另一台机器,我不确定,但也在那里工作。
所以,我去了一台从未见过该项目的机器,当时我编译它并部署了可执行文件(我正在其他机器上执行 VS 项目)。我在那台机器上删除了 4.0 之后的所有 .NET 框架并尝试运行该应用程序。而且......它仍然有效!它使用 SHA256 对 XML 进行签名,并且工作正常。所有这些机器都运行 Windows 10。
有人知道发生了什么吗?
【问题讨论】:
-
加密算法通常会向后移植到旧版本以保持兼容性。这可能是一个非常简单的答案。如果您安装 Windows XP 和第一个可分发的 4.0,它可能会失败。请注意,Microsoft 有不保留/显示真实版本信息的讨厌习惯(4.0.0 和 4.0.999 的文件可能具有相同的文件名,仅以最后更改日期区分)。
-
但真正奇怪的是,当我开始将代码改编为 SHA256 时,如果没有 CryptoConfig.AddAlgorithm () 调用,它就无法工作。我正在使用框架 4.6。现在,有了框架 4.0,它就可以工作了。我会这样做,创建一个安装干净的 Windows XP SP3 的虚拟机,然后看看会发生什么。
标签: .net xml cryptography sha256