在"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
新闻热点
疑难解答