2017-07-28 59 views
1

這是一個奇怪的問題,但我會嘗試。使用SHA256簽名XML時,它不應該工作

我開始使用目標框架作爲4.5.2的項目,並且要求使用SHA1算法簽署XML文件。我使用的例子在這個MSDN頁面,它工作得很好:

之後,要求改爲SHA256算法。我使用的代碼在這些頁面以適應該原代碼,它工作得很好,我用的是4.6,通過當時的目標框架:

後來我發現,該框架的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.

有人有什麼想法是怎麼回事?

+0

爲了保持兼容性,密碼算法常常被移植到舊版本。這可能是一個非常簡單的答案。這可能是因爲如果你安裝Windows XP並且4.0的第一次可分配,它將會失敗。請注意,微軟有沒有保留/顯示真正的版本信息(4.0.0和4.0.999的文件可能具有相同的文件名,只是由最後的更改日期區分)。 –

+0

但是真正奇怪的是,當我開始將代碼適配到SHA256時,沒有CryptoConfig.AddAlgorithm()調用,它就無法工作。我正在使用框架4.6。而現在,與框架4.0它的作品。我會這樣做,用乾淨的Windows XP SP3安裝創建一個虛擬機,看看會發生什麼。 –

回答

0

您定位的版本和您運行的版本不一樣。任何目標4.0-4.7都可以在4.7運行時運行。由於添加支持不會中斷,因此目標版本撤銷並未完成。

由於WinXP不會有4.6.2,你需要自己添加處理程序。針對XP提供的任何框架將限制您使用的API,但正如您所看到的,運行時可能會有不同的表現,所以您應該在目標操作系統上進行測試。

+0

你的意思是,即使我的目標版本是4.0,而且機器上有4.0版本,但機器上也有版本4.7,它可以在我的項目上運行版本4.7而不是版本4.0?但是,那麼爲什麼在我更改框架版本之後,對X509Certicate2.GetRSAPrivateKey()方法的調用就停止了工作?爲什麼我的應用程序的編譯版本在卸載了4.0以上所有版本的機器上運行?它對我來說依然沒有意義! –

+0

有沒有辦法在運行時檢查我的應用程序正在使用哪個版本的框架? –

+0

我會嘗試:https://stackoverflow.com/questions/8517159/how-do-i-detect-at-runtime-that-net-version-4-5-is-currently-running-your-code –

0

Marteen Bodewes評論和bartonjs答案,我已經做了一些研究和了解.NET框架的一些事情。在過去,我真的買了微軟市場營銷的關於.NET的並行功能,但我一直認爲,每個版本的框架將在同一臺機器上共存。今天我瞭解到,這並不完全如此。

首先,CLR和框架是不同的東西,不一定走在一起。公共語言運行時(Common Language Runtime,CLR)是框架的關鍵部分,用於判斷是否存在並行共存。今天只有4個版本的CLR:1.0,1.1,2.0和4:

所有共享相同的CLR版本框架版本,將就地更換以前的版本。所以,如果你在一臺機器上只有Framework 2.0,你有CLR 2.0和Framework 2.0。如果您在該機器上安裝Framework 3.5,您仍然擁有CLR 2.0,但Framework 2.0將被替換爲3.5版本。之後,如果您安裝了Framework 4.0,則需要CLR 2.0和CLR 4以及Framework 3.5和Framework 4.0。如果你在同一臺機器上安裝Framework 4.5,你仍然有CLR 4,但現在框架4.0被版本4.5所取代。

這就是爲什麼,至少在我的機器上,我只有'C:\ Windows \ assembly'路徑下的v2.0和v4.0文件夾。我注意到,在運行時,.NET DLL將從該路徑加載。不過,我不確定'C:\ Windows \ Microsoft.NET \ Framework'這個東西的目的是什麼。

但是這並沒有回答我問bartonjs的問題:如果新版本的框架消除了與該機器共享相同CLR的以前版本,Visual Studio如何知道哪些類,方法,屬性等。對於爲該項目選擇的特定目標框架是否有效?

所以我發現由Scott Hanselman在這個優秀的文章:

答案是:在目錄「C:\ Program Files文件(x86)的\參考大會\微軟\ Framework \ .NETFramework'是所有通過機器的版本的存檔,並且Visual Studio使用這些! (爲什麼沒有在一個地方擁有所有這些東西,並且真正並列共存呢?)

在所有這些答案之後,我更好地理解了發生了什麼(順便說一句,我發現那個最後一臺機器確實安裝了4.7的框架,因爲我卸載了所有的,但是我打算在它上面安裝Visual Studio Community 2017,並且取消了我的測試,但是Visual Studio安裝程序已經安裝好了,把最後一個框架放在機器上),當我在Windows XP SP3下執行應用程序時,它確實失敗並不奇怪。但現在我知道該怎麼做。

相關問題