分析:
软件版本和强签名的问题。
强名称是由程序集的标识、公钥和数字签名等信息组成的,其中程序集的标识包括简单文本名称、版本号、区域性信息等。这些信息都在被包含的程序集清单之中。相对于强签名程序集,弱签名程序集拥有完全一样的元数据、CLR文件头和程序集清单,惟一不同的是弱签名程序集不能进行数字签名,且没有公钥。弱签名程序集只能进行私有部署,不能被放入全局程序集缓存(GAC)中。
注意:在现代密码体制中,加密和解密一般采用非对称密钥密码系统,也就是不同的密钥(公开密钥)。这样每个通信方均需要2个密钥,即公钥和私钥,这2把密钥可以互为加解密。公钥是公开的,不需要保密,而私钥是由个人持有,并且必须注意保密、妥善保管。
当在.NET中创建一个强签名时,依据加密机制,其公钥将被添加到程序清单之中。同时,在发布(Publish)程序集时,同时生成一个数字签名,这个数字签名包含了程序集清单的散列值,而程序集清单又包含了当前程序集中的所有模块的散列值。在这种情况下,只有拥有程序集的公钥和私钥,才可以对程序集做修改。因此在强签名程序集中,数字签名和公钥一起实现了对程序集的保护。
强签名有2个作用:
(1)惟一标识程序集,防止程序集重名。
(1)保护程序集,防止被非法篡改。
下面以C#的编译器csc.exe为例说明如何生成一个强命名的程序集。首先,需要为新的强命名程序集准备一对惟一的公钥/私钥。.NET Framework提供了一个很实用的工具sn.exe。
打开一个VS2008的命令台,如图2.2所示。
图2.2 打开命令台
当进入控制台界面时,输入下面这条命令:
sn –k C:\Public_Private_Key.snk
屏幕呈现图2.3所示控制台界面:
图2.3 控制台
sn.exe将在C盘根目录下生成一个Public_Private_Key.snk文件。用户可以控制sn.exe的输入参数来得到公钥或者实现其他功能。准备好了公钥/私钥对,笔者将开始创建一个强命名的程序集。打开命令台并且进入HelloKitty.cs所在的目录,输入以下命令:
//首先进入HelloKitty.cs所在的目录
cd E:\WebTemp\nunit\MyConsole
//然后将前面生成的Public_Private_Key.snk也copy到HelloKitty.cs所在的目录
//运行下面的命令就生成一个HelloKitty.dll
csc.exe /t:library HelloKitty.cs /keyfile:Public_Private_Key.snk
这样,一个名为HelloKitty.dll的强命名程序集就被生成了。
总结:
可利用强签名进行源代码的保护和版本间的维护。强签名的原理是不对称签名验证算法。生成强签名需要借助.NET Framework提供的sn.exe和csc.exe这2个工具。在.NET的命令台调用sn..exe,生成一个后缀名为.snk的公钥/私钥,运行csc.exe即可以生成一个强签名的程序集。