共享程序集和強命名程序集(3):強命名程序集的一些做用

強命名程序集能防篡改工具

用私鑰對程序集進行簽名,並將公鑰和簽名嵌入程序集,CLR就能夠炎症程序集未被修改或破壞。程序集安裝到GAC時,系統對包含清單的那個文件的內容進行哈希處理,將Hash值與PE文件中嵌入的RSA數字簽名進行比較。若是兩個值徹底一致,代表內容未被篡改。此外,系統還對程序集的其餘文件的內容進行哈希處理,並將Hash值與清單文件的FileDef中存儲的哈希值進行比較。任何一個哈希值不匹配,代表程序集至少有一個文件被篡改,程序集將沒法安裝到GAC。性能

應用程序須要綁定到程序集時,CLR根據被引用的程序集的屬性在GAC中找到該程序集。找到被引用的程序集,就返回包含他的子目錄,並加載清單所在的文件。以這種方式查找程序集,可保證運行時加載的程序集和最初編譯時生成的程序集來自同一個發佈者,由於進行引用的程序集的AssemblyRef表中的公鑰標記與被引用程序集的AssemblyRef表中的公鑰匹配。若是被引用程序集不在GAC中,CLR會查找應用程序的基目錄,而後查找應用程序配置文件中標註的任何private路徑。而後,若是應用程序由MSI安裝,CLR要求MSI定位程序集。若是在任何位置都找不到程序集,那麼綁定失敗,拋出異常。測試

若是強命名程序集文件從GAC以外的位置加載,CLR會在程序集加載後比較哈希值。也就是說,每次應用程序執行並加載程序集時,都會對文件進行hash處理,以犧牲性能爲代價,保證程序集文件內容沒有被篡改。CLR在運行時檢測到不匹配的哈希值會拋出異常。spa

注:將強命名程序集安裝到GAC時,系統會執行檢查,確保包含清單的文件沒有被篡改。這個檢查僅在安裝的時候執行一次。除此以外,爲了加強性能,若是強命名程序集被徹底信任,並加載到徹底信任的APPDomain中,CLR將不檢查該程序集是否被篡改。相反,從那個飛GAC的沐浴露加載強命名程序集時,CLR會校驗程序集的清單文件,確保文件內容未被篡改,形成該文件每次加載都形成額外的性能開銷。命令行

延遲簽名開發

SN.exe工具生成公鑰/私鑰對時,會調用Windows提供的Crypto API。密鑰可存儲到文件或其餘存儲設備中。例如,大公司會將本身的私鑰保存到一個硬件設備中,再將硬件鎖進保險庫。公司只有少數人才能訪問私鑰。這項措施能夠防止私鑰泄露,並保證了密鑰的完整性。固然,公鑰是徹底公開的,能夠自由分發。部署

準備打包本身的強命名程序集時,必須使用受嚴密保護的私鑰對它進行簽名。然而,在開發和測試程序集時,訪問這項受嚴密保護的私鑰可能有點礙事。所以,.Net提供了延遲簽名,該技術也被稱爲部分簽名。延遲簽名容許只用公司的公鑰生成程序集,暫時不用私鑰。因爲使用了公鑰,引用了程序集的其餘程序集會在他們的AssemblyRef元數據表的記錄項中嵌入正確的公鑰值。另外,它還使程序集能正確存儲到GAC的內部結構中。固然,不用公司的私鑰對文件進行簽名,便沒法實現防篡改保護。這是由於沒法對程序集的文件進行哈希處理,沒法在文件中嵌入數字簽名。然而,失去這種保護不是一個大問題,由於只是在開發階段才延遲簽名。打包和部署程序集確定會簽名。編譯器

爲了實現延遲簽名,須要獲取存儲在文件中的公鑰值,將文件名傳給用於生成程序集的實用程序。另外,還必須讓工具知道你想延遲對程序集的簽名,暫不提供私鑰。hash

編譯器或AL.exe一旦檢測到要對程序集進行延遲簽名,就會生成程序集的AssemblyDef清單記錄項,其中將包含程序集的公鑰。公鑰使程序集能正確存儲到GAC。另外,這也不妨礙引用了改程序集的其餘程序集的正確生成。在進行引用的程序集的AssemblyRef元數據表記錄項中,會包含正確公鑰。建立程序集時,會在生成的PE文件中爲RSA數字簽名預留空間。文件內容不會在這個時候進行哈希處理。編譯

目前生成的程序集沒有有效簽名。安裝到GAC會失敗,由於還沒有對文件內容執行哈希處理——文件表面上已被篡改了。在須要安裝到GAC的每臺機器上,都必須禁止系統驗證程序集文件的完整性。這要求使用SN.exe實用程序並指定-Vr命令行開關。用這個開關執行SN.exe,程序集的任何文件在運行時加載時,CLR都會跳過對其哈希值的檢查。

結束程序集的開發和測試以後,就要正式對其簽名,以便打包和部署。爲了對程序集進行簽名,要再次使用SN.exe實用程序,使用-R開關,並指定了包含私鑰文件的名稱。-R開關指示SN.exe對文件內容進行哈希處理,用私鑰對其進行簽名,並將RSA數字簽名嵌入文件中以前的預留空間。這樣,就能夠部署徹底簽好名的程序集。

相關文章
相關標籤/搜索