這是一個奇怪的問題,但我會嘗試。使用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安裝創建一個虛擬機,看看會發生什麼。 –