CLR via C 共享程式集和強命名程式集

2021-10-03 02:26:20 字數 4402 閱讀 7302

基礎知識:如下所示:

1.要想將型別從乙個程式集移動到另乙個程式集而不造成應用程式中斷,可以使用system.runtime.compilerservices.typeforwardedtoattribute特性在舊的程式集中傳入新程式集中該型別的字串,然後在新的程式集中傳入舊程式集中該型別的字串。

建立強命名程式集:如下所示:

1>.使用vs提供的sn.exe工具建立簽名檔案。

建立命令如下所示:

// 生成包含公鑰和私鑰對的簽名檔案mycompany.snk

sn -k mycompany.snk

// 將簽名檔案mycompany.snk中的公鑰資料以sha256演算法寫入到公鑰檔案mycompany.publickey中

sn -p mycompany.snk mycompany.publickey sha256

// 顯示公鑰檔案mycompany.publickey中的公鑰和公鑰標記(對公鑰進行雜湊處理的後8位元組資料)

sn -tp mycompany.publickey

2>.使用csc.exe工具中的/keyfile命令來對包含元資料清單表的pe檔案進行簽名。

簽名命令如下所示:

// 編譯program.cs檔案生成pe檔案,然後使用mycompany.snk簽名檔案對該pe檔案進行簽名

csc /keyfile:mycompany.snk program.cs

簽名流程如下所示:

1>>.生成包含元資料清單表的pe檔案後,會對pe檔案的內容進行雜湊處理從而得到雜湊值。

2>>.將得到的雜湊值使用簽名檔案中的私鑰進行簽名從而得到rsa數字簽名。

3>>.將得到的rsa數字簽名儲存到pe檔案的保留區域。

4>>.將簽名檔案中的公鑰儲存到pe檔案中的程式集清單表中。

5>>.引用了其他的強命名程式集時,就會將引用程式集的公鑰標記儲存到程式集引用表的public key欄位中。

全域性程式集快取:一般位於%systemroot%\microsoft.net\assembly目錄下。具有以下特性:

1.net framework在安裝時會將只包含元資料資訊的程式集拷貝到編譯器/clr目錄下當做編譯時尋找程式集使用;同時會將包含元資料資訊和il**的程式集拷貝到全域性程式集快取的子目錄裡面當做執行時引導程式集使用。

2.不要嘗試在子目錄裡手動部署強命名程式集,因為子目錄都是演算法自動生成的,手動部署容易出錯;此時可以使用gacutil.exe工具來完成強命名程式集的部署操作。常見命令如下表所示:

命令描述

/i將某個強命名程式集安裝到全域性程式集快取中。

/il將乙個或者多個強命名程式集安裝到全域性程式集快取中。

/u將某個強命名程式集從全域性程式集快取中解除安裝。

/ul將乙個或者多個強命名程式集從全域性程式集快取中解除安裝。

/l列出通過指定程式集名字篩選出的全域性程式集快取。

/r指定要安裝或者解除安裝的跟蹤引用。

/lr列出通過指定程式集名字篩選出的全域性程式集快取以及所有跟蹤引用。

/cdl

/ldl

/f強制重新安裝程式集。

/nologo

取消顯示徽標版權標誌。

/silent

取消顯示所有輸出。

校驗強命名程式集:將沒有完全信任的強命名程式集安裝到全域性程式集快取或者從非全域性程式集快取載入強命名程式集時,clr會對該程式集進行安全校驗。校驗流程如下:

1.對pe檔案中的元資料清單表進行雜湊處理,得到雜湊值。

2.使用pe檔案中的公鑰對pe檔案中的rsa數字簽名進行反向簽名,得到雜湊值。

3.比對1和2步驟中的雜湊值是否相同,如果不同就說明程式集被篡改,否則就執行步驟4。

4.對程式集中的其他檔案進行雜湊處理,並將雜湊值與檔案清單表中儲存的雜湊值進行處理。任何乙個雜湊值不匹配,表明程式集至少乙個檔案被篡改。

延遲簽名:由於簽名檔案中的私鑰十分重要,所以一般都是嚴密保管的,只有少部分人有許可權可以訪問私鑰。此時如果在開發和測試階段使用私鑰對程式集進行簽名的話,審批流程繁瑣,安全性也不高,所以可以先使用簽名檔案中的公鑰來生成程式集,等到真正需要打包和部署時再用私鑰對程式集進行簽名。流程如下:

1.開發或者測試期間使用csc.exe工具的/keyfile和/delaysign開關編譯程式集。此時生成的pe檔案中儲存了簽名檔案的公鑰以及預留了rsa數字簽名的空間。命令如下所示:

// 使用延遲簽名技術將mycompany.publickey公鑰檔案的內容寫入到myassembly.dll程式集中並預留rsa數字簽名空間

csc /keyfile:mycompany.publickey /delaysign myassembly.cs

2.使用sn.exe工具的-vr開關讓clr不校驗程式集,從而可以將該程式集順利的安裝到全域性程式集快取。命令如下所示:

// -vr開關會將程式集的身份新增到hkey_local_machine\software\microsoft\strongname\verification登錄檔子項中

sn.exe -vr myassembly.dll

3.打包和部署程式集時使用sn.exe工具的-ra開關讓簽名檔案的私鑰對程式集進行簽名並將rsa數字簽名儲存到pe檔案中預留的空間。命令如下所示:

// 使用mycompany.privatekey私鑰檔案對程式集myassembly.dll進行簽名並將rsa數字簽名儲存到pe檔案中預留的空間

sn.exe -ra myassembly.dll mycompany.privatekey

4.在實際環境中測試時使用sn.exe工具的-vu或者-vx開關重新啟用對程式集的校驗。命令如下所示:

sn -vu myassembly.dll
5.當簽名檔案在csp容器中時,就要將上述的/keyfile換成/keycontainer,-ra換成-rc。

程式集部署區別:程式集可以採取私有或全域性兩種部署方式。其中私有部署指的是部署到應用程式根目錄或者子目錄;而全域性部署指的是部署到全域性程式集快取。由於全域性部署沒有對登錄檔進行操作,所以沒法實現簡單的安裝,備份,還原,移動和刪除應用程式,所以我們建議盡量使用私有而不是全域性部署。

弱命名和強命名程式集區別:如下所示:

1.兩種程式集的結構完全相同,唯一區別就是強命名程式集使用發布者的秘鑰進行簽名。

2.弱命名程式集只能使用私有部署方式,而強命名程式集可以使用私有和全域性兩種部署方式。

3.clr查詢弱命名程式集時會根據程式集名稱(包含副檔名)從部署的位置處進行查詢。

4.clr查詢強命名程式集時會根據程式集名稱(不包含副檔名),版本號,語言文化和公鑰從部署的位置處進行查詢。

應用程式配置檔案:clr在應用程式配置檔案中進行檢查程式集或者版本號以及版本號重定向操作。常見的元素如下所示:

1.codebase元素:查詢弱命名程式集時,不能有version屬性且url必須指向應用程式根目錄下的乙個子目錄;查詢強命名程式集時,會嘗試從url處查詢。

2.probing元素:查詢弱命名程式集時,檢查應用程式根目錄下的privatepath指定的子目錄;查詢強命名程式集時,檢查全域性程式集快取或者由codebase元素指定的url,只有在未指定codebase元素時才會檢查應用程式根目錄下的privatepath指定的子目錄。

3.assemblyidentify元素:指定程式集的名稱,公鑰標記和語言文化等。

4.bindingredirect元素:將舊區間版本號重定向成新版本號。

5.publisherpolicy元素:是否應用發布者策略檔案。當為應用時,clr會在全域性程式集快取中檢查新的程式集版本,並進行程式集發布者認為有必要的任何版本號的重定向操作。

發布者策略控制:在發布新程式集給使用者安裝時,通過新程式集中的策略控制檔案來將指定版本號的舊程式集自動更新成新版本程式集。具有以下特性:

1.發布者策略程式集必須安裝到全域性程式集快取中。

2.發布者策略控制檔案的元素除了不能使用publisherpolicy和probing外,其餘可以使用的元素跟應用程式配置檔案一樣。

3.發布者策略程式集的名稱格式為"policy.舊主版本號.舊次版本號.舊程式集名.新程式集副檔名"。

4.發布者策略程式集含有自身的版本號,clr會查詢最新版本號的發布者策略程式集。

5.發布者策略程式集必須跟舊程式集使用相同的簽名檔案,只有這樣才能判定是同乙個程式集。

6.生成發布者策略程式集時必須使用/linkresource開關來將發布者策略控制檔案以乙個單獨的xml檔案鏈結到程式集內,而不是使用/embedresource開關來將發布者策略控制檔案嵌入到程式集內。

CLR 共享程式集和強命名程式集

2017年08月12日 23 36 52 生活常識 閱讀數 187 clr支援兩種型別的程式集 弱命名程式集 weakly named assembly 和強命名程式集 strongly named assembly 二者的區別 強命名程式集使用發布者的公鑰 私鑰進行了簽名。這一堆金鑰允許對程式集進...

第 3 章 共享程式集和強命名程式集

clr 支援兩種程式集 弱命名程式集 weakly named assembly,即無簽名的程式集 和 強命名程式集 strongly named assembly,即帶簽名的程式集 兩者程式集結構完全相同。兩者區別在於,強命名程式集使用發布者的公鑰 私鑰進行了簽名。這一對金鑰允許對程式集進行唯一性...

第三章 共享程式集和強命名程式集

由檔名 不記副檔名 版本號,語言文化標示,公鑰組成.如 mytypes,version 1.0.8123.0,culture netural,publickeytoken b77a5ac55 system.reflection.assemblyname輔助類,可獲取和設定有關程式集的這些資訊.sn ...