分析:

软件版本和强签名的问题。

强名称是由程序集的标识、公钥和数字签名等信息组成的,其中程序集的标识包括简单文本名称、版本号、区域性信息等。这些信息都在被包含的程序集清单之中。相对于强签名程序集,弱签名程序集拥有完全一样的元数据、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即可以生成一个强签名的程序集。

posted on 2012-02-23 14:48  IamScree  阅读(1593)  评论(0编辑  收藏  举报