共享程序集和強命名程序集

1、DLL HELL:假如兩個程序集都複製到同一個已知的目錄中,最後一個安裝的就是“boss",造成正在使用舊程序集的所有應用程序都無法正常工作。
2、一個強程序集的四個屬性:一個文件名、一個版本號、一個語言文化表示、以及一個公鑰。公約標記
3、方法:創建一個公鑰/私鑰對,然後公鑰可以同程序集關聯。
4、使用SN.exe產生公鑰私鑰對  SN -k MyCompany.snk 

     查看實際公鑰: SN -p MyCompany.snk MyCompany.PublicKey 
     SN -tp MyCompany.PublicKey 
5、創建一個強命名程序集: csc  /keyfile:MyCompany.snk app.cs    此時就會打開指定的文件(MyCompany.snk),用私鑰對程序集進行簽名,並將公鑰嵌入清單。
      VS中新建一個公鑰/私鑰文件,顯示項目屬性,進入”簽名“選項卡,勾選”爲程序集簽名“,然後從”選擇強名稱密鑰文件“框中選擇”新建“
對一個文件進行簽名的確切含義:生成一個強名稱程序集時,程序集的FileDef清單元數據表列出了構成程序集的所有文件,每次將一個文件的名稱添加到清單中,文件的內容都會進行哈希處理,得到的哈希值會和文件名一道存儲到FileDef表中。

簽名的解釋位於下方:
加密和解密:發送方利用接收方的公鑰對要發送的明文進行加密,接受方利用自己的 
私鑰進行解密,其中公鑰和私鑰匙相對的,任何一個作爲公鑰,則另一個 
就爲私鑰.但是因爲非對稱加密技術的速度比較慢,所以,一般採用對稱 
加密技術加密明文,然後用非對稱加密技術加密對稱密鑰,即數字信封 技術. 


簽名和驗證:發送方用特殊的hash算法,由明文中產生固定長度的摘要,然後利用 
自己的私鑰對形成的摘要進行加密,這個過程就叫簽名。接受方利用 
發送方的公鑰解密被加密的摘要得到結果A,然後對明文也進行hash操 
作產生摘要B.最後,把A和B作比較。此方式既可以保證發送方的身份不 
可抵賴,又可以保證數據在傳輸過程中不會被篡改。

這裏有個疑問,如果有人截獲了這個數據包,豈不是知道了這個數據加密的公鑰私鑰嗎?那樣還有什麼祕密可言??

 
哈希默認使用的算法是:SHA-1算法。想覆蓋默認的哈希算法,可使用AL.exe的/algid開關,也可以再程序集的某個源代碼文件中,在assembly這一級中應用System.Reflection.AssemblyAlgorithmIdAttribute這個定製的attribute。
 
生成了包含清單的PE文件後,會對PE文件的完整內容進行哈希處理!這個哈希值使用發佈者的私鑰進行簽名,最後得到的RSA數字簽名會存儲到PE文件的一個保留區域中。PE文件都CLR頭會進行更新,反映出數字簽名在文件中的嵌入位置。
發佈者公鑰也嵌入這個PE文件的AssemblyDef清單元數據表中。
 
如果判斷是否是強名稱程序集?可以使用ILDasm程序查看其元數據,裏面有一個AssemblyDef記錄項就會在Public Key字段之後顯示相應的字節。這裏存儲的是完整的公鑰,而不是公鑰標記。
 

6、全局程序集緩存
 C:\Windows\Microsoft.NET\assembly
在這個文件夾中因爲有分級目錄,永遠不要手動安裝!

GACUtil.exe工具用來安裝一個強命名程序集文件。C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools 書上說的工具所在地!要想使用,必須得在cmd窗口下

GAC只能由windows administrators組的組員操作。 主要使用/i /u開關,安裝或者卸載;也可以使用/r開關,將程序集與windows的安裝與卸載引擎集成到一起。
 
  [Command Prompt]窗口其實就是在cmd窗口   

如果將強命名程序集打包到一個.cab文件,使用的時候需要解壓成臨時文件。當程序集安裝好之後,臨時文件可以刪除。

最終的建議是:程序猿儘量避免全局部署,儘量使用私有部署

7、在生成的程序集中引用一個強名稱程序集
這裏會講到 /reference開關。如果後面的文件名是一個完整的路徑,csc.exe會加載指定的文件,並根據它的元數據生成程序集

如果不是一個完整的路徑,則會通過其他的方式來尋找這個程序集:
(1)工作目錄
(2)包含csc.exe本省的目錄,目錄中還包含CLR的各種DLL文件
(3)使用/LIB編譯器開關指定的任何目錄;
(4)使用LIB環境變量指定的任何目錄

System.Object是在MSCorLib.dll中定義的。 C:\Windows\Microsoft.NET\Framework64\v2.0.50727 這個程序集文件在這裏。

8、安裝.net framework時,實際會安裝Microsoft的程序集文件的兩套拷貝。一套安裝在編譯器/CLR目錄,另一套安裝到一個GAC子目錄。編譯器/CLR目錄中的文件方便生成程序集,而GAC中的拷貝方便在運行時加載。但是我沒有找到/CLR目錄,也沒有找到GAC目錄

9、將一個強命名的程序集安裝到GAC時,系統會執行一次檢查,覈實含有清單的那個文件沒有被篡改。這個檢查只在安裝時執行一次。除此之外,爲了增強性能,如果程序集被完全信任,並加載到一個完全信任的AppDomain,CLR不檢查強命名的程序集是否被篡改。相反,從非GAC的一個目錄加載強命名程序集時,CLR會校驗程序集的清單文件,覈實文件的內容未被篡改,造成該文件每次加載都會帶來額外的性能開銷。

10、延遲簽名:關鍵點將一個強命名的程序集安裝到GAC中時,禁止系統驗證程序集文件的完整性。(跳過對其哈希值的檢查)

延遲開發技術的步驟:
(1)開發程序集期間,獲取只包含你的公司的公鑰的一個文件,使用/keyfile 和 /delaysign編譯器開關編譯程序集。
       csc /keyfile:MyCompany.PublicKey /delaysign MyAssembly.cs
(2)生成程序集之後,執行以下命令,使CLR暫時信任程序集的內容,不對它進行哈希處理,也不對哈希值進行比較。這使程序集能順利安裝到GAC。現在,可以生成引用了這個程序集的其他程序集,並可隨意測試程序集。
     SN.exe -Vr MyAssembly.dll 
(3)準備好打開和部署程序集時,請獲取你的公司的私鑰,然後執行以下命令。如果願意,可以將這個新版本安裝到GAC中,但是只有在完成了步驟四之後,才能把它安裝到GAC中。
     SN.EXE -R MyAssembly.dll MyCompany.PrivateKey
(4)爲了在實際環境中測試,重新啓用對這個程序集的驗證。
     SN -Vu MyAsembly.dll

私鑰的存儲:CSP(Cryptographic Service Provider) 提供了對這些密鑰的位置進行抽象的容器。
如果公鑰、私鑰對在一個CSP容器中,必須爲CSC.EXE Al.exe SN.exe程序指定不同的開關。
CSC.EXE /keycontainer ;  al.exe /keyname; sn.exe -Rc (進行延遲簽名)

11、”運行時“如何解析類型引用?
運行這個應用程序時,CLR會加載並初始化它。然後,CLR讀取程序集的CLR頭,查找標識了應用程序入口方法(Main)的MethodDefToken.
然後,CLR會檢索MethodDef元數據表,找到該方法的IL代碼在這文件中的偏移量,把這些IL代碼JIT編譯成本地代碼。編譯時會對代碼進行驗證以確保類型安全性。最後,執行本地代碼。

12、發佈者策略控制:
作用:當一個程序集安裝到用戶機器上,就會安裝這些策略信息。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章