讀書筆記—CLR via C#章節3

來源:互聯網
上載者:User

標籤:style   blog   http   io   os   使用   strong   檔案   sp   

這本書這幾年零零散散讀過兩三遍了,作為經典書籍,應該重複讀反覆讀,既然我現在開始寫博了,我也準備把以前覺得經典的好書重讀細讀一遍,並且將筆記整理到部落格中,好記性不如爛筆頭,同時也在寫的過程中也可以加深自己理解的深度,當然同時也和技術社區的朋友們共用。

強命名程式集

優點

  • 程式集共用
  • 版本共存,解決DLL hell
  • 安全性原則(防篡改)
  • 發布策略控制

標識組成

  • 檔案名稱(不計副檔名)+版本號碼+語言文化+公開金鑰

CLR載入方式

  • 弱命名程式集私人部署,CLR在基目錄或子目錄中搜尋時只使用程式集名稱
  • CLR搜尋強命名程式集時,使用完成的程式集標識

建立步驟

  1. 使用Strong Name(SN.exe)擷取密鑰, SN –k MyCompany.snk,該檔案包含二進位的公開金鑰和私密金鑰
  2. (可選)SN –p MyCompany.snk MyCompany.PublicKey,建立只包含公開金鑰的檔案
  3. (可選)SN –tp MyCompany.PublicKey,查看完整公開金鑰和公開金鑰標記,私密金鑰不可查看
  4. 使用csc編譯 csc /keyfile:MyCompany.snk app.cs
  5. 編譯器開啟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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.