強命名程序集的一個好處是防篡改。假如我有一個程序集MyDll.dll,如果我用我自己的私鑰進行簽名將程序集中的內容進行哈希處理,其他人如果不知道我的私鑰的話,就不能篡改我的這個程序集進行某些惡意的行為。
但對於一些大型程序的開發,私鑰一般是不公開的,當然,與它匹配的公鑰是公開的,可以自由分發。那麼如何確保開發人員在開發的過程中使用強命名程序集(如希望將其放到GAC中,因此必然得是強命名程序集)。延遲簽名就是為此目的。
仍以MyDll.dl為例:
1)生成公鑰/私鑰對
sn -k Company.snk
2)提取出公鑰,而將私鑰另外進行妥善保管
sn -p Company.snk public.snk
3)對程序集進行延遲簽名
csc /keyfile:public.snk /delaysign /t:library MyDll.cs
4)讓CLR信任程序集的內容,不執行哈希處理
sn -Vr MyDll.dll
由於上面的命名會在注冊表中添加相應項,因此對同一程序集只需執行一次。
這樣,MyDll.dll就可以安裝到GAC中(如果你願意的話)
5)其他開發人員可以引用此程序集,就好像一般的強命名程序集一樣
6)假如開發完成要進行最終部署的話,一定要用私鑰進行簽名。
否則,有人完全可以用這個公鑰來做一個相同的程序集來替換掉你的這個程序集來做些壞事。
總之,程序集的安全會大打折扣。為此,讓保管私鑰的人來完成如下簽名
sn -R MyDll.dll Company.snk
注:我們不能單獨提取出私鑰,私鑰和公鑰是在一個文件中。公鑰可以單獨提取出來,以便於分發。
7)打開驗證,在4)中的注冊表項會被相應移除
sn -Vu MyDll.dll