在"C#程序集系列08,設置程序集版本"中體驗了為程序集設置版本,但對于程序集的安全性來說,還遠遠不夠。本篇體驗程序集的簽名。
□ 程序集的簽名
→F盤as文件夾下有多個文件
→在程序集所在文件夾創建密匙
→打印密匙
密匙是一堆亂碼,這是經過加密了。→在密匙的基礎上創建公匙Public Key
→打印公匙Public Key
注意:這里的public token是public key經過哈希算法而獲得的。當程序集被引用,該程序集對外是以public token形式存在的。
→現在重新編譯"C#程序集系列08,設置程序集版本"中的Cow.cs,但這次使用密匙
→重新編譯"C#程序集系列08,設置程序集版本"中的MainClass.cs,引用剛創建的Farm.dll
→運行MainClass.exe
→現在模擬一個病毒程序集,首先在F盤的as文件夾中創建CowVirus.cs→用記事本打開CowVirus.cs,編寫如下,保存
using System;using System.Reflection;[assembly: AssemblyVersion("3.3.3.3")]public class Cow{public static void Moo(){Console.WriteLine("我是病毒");}}
→編譯CowVirus.cs,生成新的Farm.dll,重寫原先的Farm.dll,并且在沒有私匙的情況下
→再次運行MainClass.exe
可見,病毒程序雖然模擬了一個相同名稱的程序集,但由于沒有簽名,該程序集不會得到主程序的認可。
□ Public Token
如果一個A程序集有public key,且被B程序引用,如果我們反編譯B程序,在B程序的IL代碼中就可以看到A程序集有一個public token,這個public token是根據A程序集的public key經哈希算法而得到的。
→再次重寫Farm.dll,編譯Cow.cs文件,并且使用密匙
→反編譯Farm.dll
來看Farm程序集的清單部分:
.assembly Farm{<PRe style="font-size: 11px; font-family: consolas,'Courier New',co
新聞熱點
疑難解答