这是一个奇怪的问题,但我会尝试。使用SHA256签名XML时,它不应该工作
我开始使用目标框架作为4.5.2的项目,并且要求使用SHA1算法签署XML文件。我使用的例子在这个MSDN页面,它工作得很好:
之后,要求改为SHA256算法。我使用的代码在这些页面以适应该原代码,它工作得很好,我用的是4.6,通过当时的目标框架:
https://blogs.msdn.microsoft.com/winsdk/2015/11/14/using-sha256-with-the-signedxml-class/
的.NET Framework 4.6.2增加支持签署XML文档使用RSA-SHA256 [我不能发布超过2个链接]
后来我发现,该框架的4.6.2版本增加了对SHA256全力支持,并且加密Config.AddAlgorithm()调用不再是必需的。我将项目更改为版本4.6.2,进行了所需的更改,评论CryptoConfig.AddAlgorithm()调用,它工作得很好。我们希望我们的软件能够在Windows XP下工作(是的,我们确实有用户仍然在使用它),最后一个与XP(SP3)一起工作的框架版本是v4.0。所以,我需要测试用SHA256签名XML文件是否可以在Framework 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的第一次可分配,它将会失败。请注意,微软有没有保留/显示真正的版本信息(4.0.0和4.0.999的文件可能具有相同的文件名,只是由最后的更改日期区分)。 –
但是真正奇怪的是,当我开始将代码适配到SHA256时,没有CryptoConfig.AddAlgorithm()调用,它就无法工作。我正在使用框架4.6。而现在,与框架4.0它的作品。我会这样做,用干净的Windows XP SP3安装创建一个虚拟机,看看会发生什么。 –