C#与.NET程序员面试宝典 2.3.1 面试题16:如何进行源代码的保护和版本间的维护(图)

对于大多数的.NET平台开发的产品,源代码的保护和版本间的维护是很多公司首要考虑的问题,同样程序员在谈论代码生成时最先想到的可能也是软件版本和强签名的问题。本节将借助分析此问题来简要概述.NET中的签名机制。

 

【出现频率】★★★★

 

【关键考点】

强签名

强签名的作用

弱签名

 

【考题分析】

强名称是由程序集的标识、公钥和数字签名等信息组成的,其中程序集的标识包括简单文本名称、版本号、区域性信息等。这些信息都在被包含的程序集清单之中。相对于强签名程序集,弱签名程序集拥有完全一样的元数据、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 @ 2010-10-20 10:24  面试宝典  阅读(735)  评论(0编辑  收藏  举报