標籤:style blog http io os 使用 strong 檔案 sp
這本書這幾年零零散散讀過兩三遍了,作為經典書籍,應該重複讀反覆讀,既然我現在開始寫博了,我也準備把以前覺得經典的好書重讀細讀一遍,並且將筆記整理到部落格中,好記性不如爛筆頭,同時也在寫的過程中也可以加深自己理解的深度,當然同時也和技術社區的朋友們共用。
強命名程式集
優點
- 程式集共用
- 版本共存,解決DLL hell
- 安全性原則(防篡改)
- 發布策略控制
標識組成
- 檔案名稱(不計副檔名)+版本號碼+語言文化+公開金鑰
CLR載入方式
- 弱命名程式集私人部署,CLR在基目錄或子目錄中搜尋時只使用程式集名稱
- CLR搜尋強命名程式集時,使用完成的程式集標識
建立步驟
- 使用Strong Name(SN.exe)擷取密鑰, SN –k MyCompany.snk,該檔案包含二進位的公開金鑰和私密金鑰
- (可選)SN –p MyCompany.snk MyCompany.PublicKey,建立只包含公開金鑰的檔案
- (可選)SN –tp MyCompany.PublicKey,查看完整公開金鑰和公開金鑰標記,私密金鑰不可查看
- 使用csc編譯 csc /keyfile:MyCompany.snk app.cs
- 編譯器開啟snk檔案,用私密金鑰對程式集進行簽名,並將公開金鑰嵌入清單
- 通過FileDef清單中繼資料尋找程式集所有檔案
- 將所有檔案進行雜湊處理
- (可選)雜湊演算法 AL.exe /algid 或 System.Reflection.AssemblyAlgorithmIdAttribute
- (可選)預設使用SHA-1演算法
- 使用雜湊演算法對PE檔案的內容處理,使用私密金鑰簽名得到RSA數位簽章
- 簽名儲存到PE檔案的保留地區(防篡改)
- PE檔案的CLR頭會進行更新,反映數位簽章在檔案中的嵌入位置
公開金鑰標記
- 公開金鑰標記是公開金鑰的64位雜湊值 SN.exe –tp可以查看
程式集定義
- AssemblyDef中繼資料表記錄和儲存完整的公開金鑰
- 完整公開金鑰,防止被篡改
程式集引用
- AssemblyRef中繼資料表列出每個強程式集的標識
- AssemblyRef實際儲存的公開金鑰是雜湊處理最後8個位元組,簡稱公開金鑰標記
- CLR做出安全或信任決策時,使用公開金鑰而不是公開金鑰標記
GAC
- 全域組件快取(Global Assembly Cache)
- 目錄: .NET 3.5和以前的版本 C:\Windows\Assembly .NET4.0和以後 C:\Windows\Microsoft.NET\Assembly
- 組織:結構化組織,通過演算法產生子目錄的名稱
- 建議:永遠不要手動複製檔案到GAC目錄,相反應該使用GACUtil.exe /i安裝 /u卸載
- 建議:GACUtil.exe /r開關,程式集綁定安裝和卸載
- 建議:使用Windows Installer(MSI)可以講程式集安裝到GAC
- 權衡:違背了簡單部署原則(複製目錄),一般私人部署就可以了,基於特殊原因使用GAC(如共用)
延遲簽名
- 也稱部分簽名,只用公開金鑰來產生程式集,暫時不用私密金鑰
- 沒有安全和篡改的問題,因為只是開發階段延遲,打包部署時還是會簽名的
- 編譯開關: csc /delaysign, AL.exe /delay[sign]
- 打包和部署時,再次使用SN.exe簽名,使用-R開關(對檔案雜湊處理,用私密金鑰進行簽名)
- 將RSA數位簽章嵌入到檔案中的預留空間
- 步驟:
- 編譯 csc /keyfile /delaysign
- 使CLR暫時信任程式集,不做雜湊處理,也不對雜湊進行比較 SN.exe –Vr MyAssembly.dll
- 部署時,擷取私密金鑰,執行命令 SN.exe –R MyAssembly.dll MyCompany.PrivateKey
- 實際環境中,執行命令,重新啟用程式集驗證,SN.exe –Vu – MyAssembly.dll
CLR載入和執行程式集的過程
其他(Tips)
- csc編譯時間,尋找程式集在4個地方尋找程式集
- 工作目錄
- 包含CSC.exe本身的目錄,目錄中還包含DLL的各種檔案
- 使用 /lib 編譯器開關指定的目錄
- 使用LIB環境變數指定的目錄
- 注意!以上尋找目錄僅僅是編譯時間,運行時不會從這裡載入程式集
- 編譯時間不區分平台架構,運行時再由CLR載入正確的程式集
- 運行時的載入程式集順序
- GAC中尋找
- codeBase指定的URI中尋找(安全驗證防篡改)
- 工作目錄中尋找
- .net framework預設安裝兩套程式集
- 編譯器CLR目錄的程式集方便產生
- GAC中的拷貝方便在運行時載入
- 通過比較FileDef清單表格儲存體中的雜湊值,不匹配則無法安裝GAC或載入程式集失敗
結語
說實話,本節中有少數部分自己也是停留在一知半解的程度,沒有做實際驗證,好讀書不求甚解,以後有需要一定會仔細驗證的!
讀書筆記—CLR via C#章節3