.NET基礎 (03)生成、部署和管理

生成、部署和管理
1 如何生成強簽名的程序集
2 如何把程序集放入GAC中
3 延遲簽名及其作用
4 程序集的版本分哪幾部分

?

1 如何生成強簽名的程序集
在生成程序集時,CLR提供了兩種可選類型:
強簽名程序集。
弱簽名程序集。

強簽名程序集是一個帶有公鑰和數字簽名的程序集,每個強簽名都可以由四個元素來唯一標識,它們分別是:文件名、版本號、語言文化和公鑰。這些信息都被包含在程序集的清單之中。相對于強簽名程序集,弱簽名程序集擁有完全一樣的元數據、CLR文件頭和程序集清單,唯一不同的是弱簽名程序集沒有公鑰,也不進行數字簽名。弱簽名程序集不能被放入全局程序集緩存(GAC)中,只能進行私有部署。

這里簡單介紹一下加密的基本概念。當我們在處理私密信息的時候,就需要用到加密技術。常用的加密技術有對稱加密技術、非對稱加密技術和不可逆加密技術。.NET的公鑰私鑰機制屬于非對稱加密技術。非對稱加密的基本概念是加密方用公鑰對信息加密,而解密方需要使用公鑰和與其配對的私鑰對已加密信息進行解密。非對稱加密的特點在于公鑰可以公開,加密算法公開,而唯一控制解密的關鍵就在于私鑰,所以在非對稱加密中,公鑰往往隨加密信息一起發送到接收方,而接收方通過公鑰來尋找與其配對的私鑰并且進行解密。現在常用的非對稱算法有RSA算法和DSA算法。

回到.NET的加密機制中,當生成一個強簽名程序時,其公鑰將被添加到程序清單之中。同時,在程序集被發布(Publish)時,也會生成一個數字簽名,數字簽名包含了程序集清單的散列值,而程序集清單又包含了該程序集中所有模塊的散列值,在這種情況下,除非擁有程序集的公鑰和私鑰,否則將無法對程序集做任何改動。可見在強簽名程序集中,公鑰和數字簽名一起實現了對程序集的保護。

下圖展示了一個強簽名程序集的內部結構,以及引用這個程序集的其他程序集的結構。程序集2引用了程序集1中的引用,所以在程序集2的CLR頭中,保留了程序集1的公鑰標記。



? 注意:由于公鑰過長,程序集引用可以使用公鑰標記來代替公鑰。公鑰標記是指公鑰的一個散列值,長為8個字節。

了解了公鑰的基本原理之后,現在筆者以C#的編譯器CSC.exe為例,來說明如何生成一個強命名的程序集。首先,需要為新的強命名程序集準備一對唯一的公鑰/私鑰。.NET Framework提供了一個很實用的工具:sn.exe。
打開一個Visual Studio 2010的命令臺,輸入下面這條命令:
sn –k C:/MyPublicPrivateKey.snk

sn.exe就會為我們在C盤根目錄下生成一個MuPublicPrivateKey.snk文件。這個文件把公鑰和私鑰拼接在了一起,大小為596字節,其中前160字節屬于公鑰,而后436字節屬于私鑰。用戶可以控制sn.exe的輸入參數來僅僅得到公鑰或者實現其他功能。

準備好了公鑰/私鑰對,就可以生成一個強命名程序集了。打開一個Visual Studio 2010自帶的命令臺并且進入xxx.cs所在的目錄,輸入以下命令:
csc.exe /t:library xxx.cs /keyfile:C:\MyPublicPrivateKey.snk

一個名為xxx的強命名程序集就被生成了,讀者可以嘗試自己編寫一個引用該強命名程序集的程序集,并且嘗試用一個弱命名程序集來代替它。當然,這是沒辦法實現的,公鑰標記和數字簽名將很好地保證程序集不能被隨意篡改。

生成強簽名的程序集需要有公鑰/私鑰對。在得到了公鑰/私鑰對后,就可以控制編譯器的輸入參數來得到一個強簽名的程序集。對于C#的編譯器CSC.exe來說,可以用/keyfile參數來制定使用那個公鑰/私鑰文件。


2 如何把程序集放入GAC中

所謂的GAC,就是全局程序集緩存(Global Assembly Cache)。被放入GAC的程序集,無論在何處被其他程序集引用,都可以保證自己能夠被CLR找到并且加載。簡單來說,GAC是一個有規范的目錄結構。如果主機使用的是Windows操作系統,并且操作系統被安裝在c:\windows下,那么GAC會被安裝在c:\windows\assembly\下。

這種顯示方式和一般的文件夾顯示方式有很大區別。實際上,.NET Framework附帶了一個全局程序集緩存的查看器assembly viewer,上圖就是這個查看器的顯示功能,它很清楚地列出了唯一標識一個程序集的4個元素:名稱、版本、文化和公鑰標記,同時,它也列出了另外一個影響程序集在GAC中目錄結構的元素:處理器體系結構。讀者可以通過關閉查看器功能來親眼看一看GAC目錄的真正面目。具體做法是在注冊表HKEY_LOCAL_ MACHINE\Software\Microsoft\Fusion下建立一個名為DisableCacheViewer的DWORD值,并且將該值設為0。讀者將會發現GAC是一個多層的目錄結構,其結構符合一定的規范。
注意 除非需要學習GAC目錄結構,否則在任何時候都不應該手動地去修改GAC目錄,任何對GAC目錄的操作都應該通過工具實現。

在一般情況下,GAC具有如下優點:

  • 程序集被多處引用時,可有效減少內存成本。
  • 通過發布者策略可以有效地發布程序集的最新版本。
  • 同一程序集的多個版本可以共存,并且可以通過配置進行切換。

是否所有的程序集都可以被放入GAC中呢,答案是否定的。只有帶有公鑰的強簽名程序集才能被部署到GAC中去,在程序集被放入GAC時,.NET將檢查程序集的CLR頭和加密值,保證程序集未被篡改。把程序集放入GAC中可以手動地部署,也可以通過工具進行部署。最簡單的方法就是通過前面介紹的assembly viewer直接把程序集拖入到assembly viewer顯示的GAC目錄下。

? 注意:這里提到的拖放,實際上還是使用了assembly viewer的功能,而不同于直接把程序集復制到GAC文件夾下。再次強調,讀者不應該手動地去修改破壞GAC目錄結構。

.NET Framework還提供了一個工具來有效地管理GAC:GACUTIL.exe。筆者生成了一個強簽名的程序集:Compile.dll。現在,嘗試將其放入GAC中:
Gacutil –i Compile.dll
進入assembly viewer,讀者將會發現剛剛加入的這個新程序集:Compile.dll,0.0.0.0。

GAC是一個具有特定目錄結構的文件夾,所有強簽名的程序集都可以被放入GAC中。可以通過.NET Framework自帶的assembly viewer來簡單地拖動添加一個程序集到GAC中,也可以利用諸如gacutil.exe等工具使用命令行來添加。總之,任何方法歸根結底,都是根據GAC的規范和程序集本身的特性,在GAC目錄下建立相應的子目錄結構。


3 延遲簽名及其作用

當生成一個強簽名程序集時,在CLR頭部中會加入公鑰和數字簽名,公鑰和數字簽名能夠保護程序集不被隨意篡改。但是,有經驗的.NET程序員或者項目經理會有這樣的切身經歷,帶有防篡改功能的程序集在開發和測試階段會變得極其不方便。為了使用和修改該程序集,項目組不得不把非常重要的私鑰分發出去,而這將會給項目的保密性帶來極大的威脅。

所以,在項目的開發和測試階段,延遲簽名技術會被經常使用。顧名思義,延遲簽名的基本概念就是把私鑰加密延遲到項目真正發布時再進行。而在開發和測試階段,程序員將只用一個公鑰來生成強簽名程序集。這樣程序集的CLR頭中只有公鑰而沒有數字簽名,數字簽名的空間將會被保留,而且所有的文件也不經過加密處理。

在CLR頭中,數字簽名的空間被保留了下來,并且沒有對文件進行HASH處理。而在其他方面,延遲簽名不會產生任何影響。說到這里,讀者可能會有這樣的疑問,延遲簽名的程序集能否被放入到GAC中呢?回顧一下在上一節中介紹的,GAC對程序集的要求為該程序集是帶有公鑰的強簽名程序集。延遲簽名的程序集帶有一個公鑰,所以原則上是可以被放入GAC的,但由于GAC會對程序集進行加密驗證,延遲簽名的程序集缺乏私鑰而沒有經歷任何HASH處理,所以延遲簽名的程序集在被放入GAC之前,需要通知.NET不要對該程序集進行加密驗證。

延遲簽名就是指把對強簽名程序集的私鑰加密和數字簽名延遲到實際發布時進行。延遲簽名提高了開發測試階段的效率,也方便了機構和項目組管理自己的私鑰。


4 程序集的版本分哪幾部分

有四個元素可以唯一標識一個強簽名程序集,分別是名字、版本號、文化和公鑰。程序集的版本號通常由四個部分組成,它們是:

  • 主版本號(Major Version)
  • 次版本號(Minor Version)
  • 內部版本號(Build Version)
  • 修訂號(Revision Version)

默認地,版本號越大代表系統越新。一般主版本號和次版本號的定義比較明確,當系統經歷一個比較大的升級,主版本號會有改動,而在一個主版本中,小功能的發布則會通過次版本號進行發布。關于內部版本號和修訂號,理解的分歧會更大一點。在一般情況下,一個內部版本號代表系統內部的一次集成周期,而一個修訂號,則代表集成周期中的一次編譯。

例如某個目前版本號為12.2的系統組織內部,決定在新版本12.3發布前進行6個集成周期,每個集成周期歷時一周,而編譯系統則被設置成每天午夜編譯一次。這樣在通常情況下,這個系統將針對6個集成周期形成6個內部版本號,從12.3.1到12.3.6。而對于每個內部版本將會經歷7次編譯,則系統會擁有7個修訂號。例如第二版本,將會擁有這樣7個版本號:12.3.2.1到12.3.2.7。

注意:版本號的劃分并沒有明確的規范。但組件發布者應該按照常用定義來確定產品的版本號,怪異的版本號劃分將會誤導組件使用者。

?

轉載請注明出處:

作者:JesseLZJ
出處:http://jesselzj.cnblogs.com

轉載于:https://www.cnblogs.com/jesselzj/p/4782493.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272989.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272989.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272989.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.net 識別一維碼_天若OCR文字識別 v5.0 原創好用的OCR及翻譯小工具

一款非常好用的OCR及翻譯小工具,集合百度、騰訊、有道、搜狗,調用了各大網站的ocr接口,免費不限次數(有道免費接口有ip限制僅供娛樂)。1、對于搜狗的接口調用的還是http://ocr.shouji.sogou.com/v2/ocr/json,這個接口識別效果很好…

html中div中加顏色,css怎樣給div加邊框顏色

css怎樣給div加邊框顏色1、css為div四個邊分別添加邊框border-color:#000(設置4邊邊框顏色為黑色)border-color:顏色值,即可設置對象邊框顏色border-left-color:#000 設置左邊框顏色為黑色border-right-color:#000 設置右邊框顏色為黑色border-top-color:#000 設置上…

Microsoft Dynamics CRM 前瑞開發

做CRM開發最大的感受就是其前瑞開發過程中,調試起來比較麻煩,需要做一些斷點還要配制一些瀏覽器設置,對新手來說比較困難。還有就是對REST調試,經常為了調試一個正確的結果而花費大量的時間。現在推薦一個REST 工具來調試CRM的前瑞…

割線法求解過程_求解稀疏優化問題2——臨近點方法+半光滑牛頓法

這篇文章是我之前一篇文章的兄弟篇,沒看過的可以看下面這個。鄧康康:求解稀疏優化問題——半光滑牛頓方法?zhuanlan.zhihu.com我們考慮的問題仍然是如下的一般問題:其中 ,并且 特別大;表示一個凸可微函數,例如 表示一…

html 樹形圖可拖拽,HTML5拖拽API實現vue樹形拖拽組件

因業務場景需要一個可拖拽修改節點位置的樹形組件,因此動手擼了一個,乘此機會摸了一把html5原生拖拽。近期有時間將核心部分代碼抽出,簡單說下實現方式。1.樹形結構-組件遞歸使用樹形結構非常簡單,tree組件作為父組件,…

navicat 或者workbench 無法連接127.0.0.1(61)的解決方法

1、輸入mysql -uroot 進入命令行模式, 2、輸入"show variables like %sock%;"查看sock文件所在位置 如: 3、配置客戶端(以navicat為例) (1)打開mac 下的navicat(2)建立相應的連接&…

jmeter如何定位網絡延時_JMeter用戶定義變量和properties變量高級使用

Jmeter有個配置元素叫做用戶自定義變量(英文名稱是UserDefinedVariables)而我們提到的vars即是Variables的簡寫。 之前我們也說到過Jmeter的腳本中(jsr223sampler或者beanshell編寫的腳本)使用varsput和varsget的操作(varsget和put的操作僅在threadgroup測試組線程中執行&#…

html5與跨平臺開發,HTML5應用與跨平臺應用開發

本課程將總體講解開發HTML5應用和跨平臺應用的方法,共分成三部分。第一部分為HTML5開發基礎,帶你分析并掌握多種移動開發技術和設計方式;第二部分為HTML5高級應用,講解在HTML5中調用其它應用或服務的方法;第三部分為跨…

jQuery中的幾個模塊總結

Query插件,以備并希望在前端方面有所長進。請批評指正。 一,類型判斷全解 JQuery判斷類型擴展方法:$.type() 1 /*type: function( obj ) { 2 if ( obj null ) { 3 return obj ""; 4 } …

python實現連續數列相加_技術 | Python經典面試題解析實現斐波那契數列

黑馬程序員微信號:heiniu526傳智播客旗下互聯網資訊,學習資源免費分享平臺大家在面試過程中經常會考到斐波那契數列,斐波那契數列(Fibonacci)最早由印度數學家Gopala提出,而第一個真正研究斐波那契數列的是意大利數學家 Leonardo …

廣西2021高考成績位次查詢,2020年廣西高考一分一段表及高考位次成績排名查詢(理科+文科)...

一、2020年廣西高考一分一段表查詢排名方法廣西招辦(考試院)會公布的省市高考每一分分數的考生數額統計表就是我們所說的——高考“一分一段表”,其顯示出每一分的分數值全省考生有多少名,就可以讓考生估算出自己的排名位次。2020年廣西高考一分一段表排…

PV公式

IP(獨立IP): 即Internet Protocol,指獨立IP數。00:00-24:00內相同IP地址之被計算一次。PV(訪問量): 即Page View, 即頁面瀏覽量或點擊量,用戶每次刷新即被計算一次。UV(獨立訪客):即Unique Visitor,訪問您網站的一臺電腦客戶端為…

csv文件 內容轉義_CSV文件如何同時轉義逗號和雙引號?

小編典典有幾個庫。這是兩個示例:阿帕奇共享郎包括一類特殊的逃避或UNESCAPE字符串(CSV,EcmaScript的,HTML,Java和JSON,XML)org.apache.commons.lang3.StringEscapeUtils 。轉義 為CSVString escaped StringEscapeUti…

臺式計算機單核與雙核,什么是單核cpu、雙核cpu 單核cpu和雙核cpu的區別是什么...

在買電腦的時候,我們經常會發愁,究竟是買單核cpu好,還是買雙核cpu比較好,尤其是面對售貨員把單核cpu電腦和雙核cpu電腦都可以夸的天花亂墜的時候,我們更糊涂了,究竟買哪種好呢?針對這種情況,小…

當用DJANGO的migrate不成功時。。。。

URL:http://my.oschina.net/u/862582/blog/355421 因為操作SQL數據庫時不規范,或是多人開發時產生了同步問題,就可能導致正規的MIGRATE時不能完成。 已其修改,不如直接生成SQL之后運行。。 記住語法即可。。。 python manage.py sqlmigrate a…

R語言seqm_R語言seq()函數用法

1、seq()用來生成一組數字的函數。Usage:## Default S3 method:seq(from 1, to 1, by ((to - from)/(length.out - 1)),length.out NULL, along.with NULL, ...)seq.int(from, to, by, length.out, along.with, ...)seq_along(along.with)seq_len(length.out)A…

美國計算機生物學要求,美國大學CS專業分支生物信息學和計算生物學專業 Bioinformatics and Computational Biology介紹...

美國留學申請美國大學計算機專業(CS)的學生非常多。美國大學CS專業的研究分支也非常 多,不同分支對學生的要求也會不同,因此,學生們要根據自己的條件選擇適合自己的研究方向。下面主要為大家介紹的是美國大學CS專業分支生物信息學和計算生物學…

Spark入門實戰系列--8.Spark MLlib(上)--機器學習及SparkMLlib簡介

【注】該系列文章以及使用到安裝包/測試數據 可以在《傾情大奉送--Spark入門實戰系列》獲取 1、機器學習概念 1.1 機器學習的定義 在維基百科上對機器學習提出以下幾種定義: l“機器學習是一門人工智能的科學,該領域的主要研究對象是人工智能&#xff0c…

cadz軸歸零命令_CAD圖形Z軸坐標歸零方法

AutoCAD2012 64位精簡版中文免安裝版軟件大小:561.5M授權方式:免費軟件立即下載CAD軟件怎樣將圖形坐標Z軸歸零?當我們遇到CAD圖形標高一致的時候,如果想要讓圖形統一標高,就需要先將圖形坐標Z軸歸零。本次小編為您整理了CAD軟件里…

net以execl做數據庫_[原創]Net實現Excel導入導出到數據庫(附源碼)

關于數據庫導出到Excel和SQLServer數據導出到Excel的例子,在博客園有很多的例子,自己根據網上搜集資料,自己做了亦歌簡單的demo,現在分享出來供初學者學習交流使用。一、數據庫導入導出到Excel,比較流行的有兩種方式&a…