文章出處

CLR用數字簽名的方式防止程序集發布后被人篡改,也可以確定發布人,這個方法就是使用公/私鑰對,然后對程序集所有模塊取一個哈希生成一個數字簽名放在程序集的元數據中。
1、創建公/私鑰對
    創建公/私鑰對有兩種方式,一種是通過Visual Studio 命令提示框執行sn -k 密鑰.snk方式創建私鑰文件;(Visual Studio 命令提示框 最好以管理員方式打開)

   第二種是在VS中,在創建的項目名稱上右鍵,打開屬性窗口,找到簽名欄。


創建出的私鑰里包含了公鑰和私鑰信息,其中私鑰436個字節,公鑰由128字節內容和一個32字節的頭組成。
2、使用公鑰進行簽名
一般在開發的時候,都會使用延遲簽名的功能,因為公鑰是公開的,私鑰是非公開的,而且私鑰一般是保密的。
在項目調試時不能一直申請使用私鑰簽名,所以微軟允許只使用公鑰簽名,公鑰可以從私鑰中獲取;
通過VS命令提示框中執行sn -p company.snk Company.public.snk命令提取公鑰文件;
指定簽名文件為生成的公鑰文件;

在延遲簽名之后的程序是不能直接運行的,如果直接運行,會出現錯誤。提示強名稱驗證失敗。
我們需要使用sn的-Vr命令告訴CLR在加載程序時,不要對哈希值進行檢查:sn -Vr signTest.exe。其中signTest.exe為目標程序集,是C#生成的exe或dll文件。
這個命令只需要執行一次,意思是在本機的CLR上注冊一下,不要驗證程序集安全性,然后在運行程序就沒問題了。
如果需要注銷只需執行命令 sn -Vu signTest.exe 即可。
3、使用私鑰進行強簽名
程序開發完成要進行發布時,調用 sn -Ra signTest.exe Company.snk對程序集進行強簽名,這樣就擁有防篡改的保護了。
強簽名之后 ,CLR每一次加載運行都回驗證程序集,如果哈希值與之前生成的公/私鑰不匹配,則認為程序已經被篡改,就會阻止程序運行。

4、使用public key token
很多時候可以看到這種引用  SignTestBll.dll,Version=1.0.2.0,Culture=neutral,PublicKeyToken=07f814c98e5c0897
這個PublicKeyToken是干什么的呢?
它其實就是根據公鑰的哈希值計算出來的,用來標識一個dll文件的唯一性。
首先使用SHA1算法從公鑰等到它的哈希值,取出這個哈希值最后的8個字節,然后把這8個字節倒排一下,就能得到了。

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜

    大師兄 發表在 痞客邦 留言(0) 人氣()