.NET安全系列之六:强名程序集

在.NET之前,Window操作系统使用一项名为Authenticode的技术来验证可执行文件。与强名技术的类似的,它也是对程序集进行数字签名,不过两项技术主要针对的目标不同。Authenticode用于标识一个可执行文件的创建人或组织。通过它我们可以执行一个程序而不用担心它是伪造的。而强名技术表人一个程序集,使相同名称但不同版本的程序集可以并行存在并使用。

强名技术主要用于程序集统一命名,假如出现程序集版本更新,就会出现多个文件采用同样的文件名但版本不同的现象。在.NET中专门提供一个称为GAC的文件夹专门用于保存同一程序集的不同版本。

实践中,一旦程序集进行了数字签名,它就具有了强名称。当程序集具的强名称包含以下4部分信息的字符串。

  • 文件的名称
  • 数字密钥的公钥记号
  • 程序集的版本,通过AssemblyVersion指定
  • 程序集的区域性设置

强名称的"强"体现在程序集的标识可以用统一的方式处理,其唯一性由公钥记号组件来保证。采用强名的另一个目的是无法伪造。只要对程序集进行数字签名,该程序集的作者或开发商就可以验证这个程序集。像微软或ECMA组织均有用于识别他们自己程序集的公钥/私钥对。

下面详细介绍.NET中对程序加强名的方法。

开发者或企业要想创建强名称的程序集,第一步就是创建一个公钥/私钥对。.NET Framework提供了sn.exe(sn为Strong Name之意)来完成这项任务。

使用此工具的-k选项可以生成一个.snk文件(strong name key的简称),这种文件包含公钥/私钥对。

使用-tp选项可以查看.snk中的公钥和私钥。

 

公钥记号

公钥的长度很大而且难于操作,.NET平台为每个公钥引入了一个公钥记号。公钥记号是一段8字节长的编码数,其是由公钥经散列算法计算出来的。它能以一种几乎唯一的方式表示公钥,而且由于长度较短所以较容易操作。创建公钥记号的原因有:

  • 减少强名称的长度(强名称可以使用公钥记号代替完整的公钥)
  • 减少引用了许多强名称程序集的程序集的长度

例如如果一个程序集的公钥记号是b03f5f7f11d50a3a,则可以确保它是由微软公司通过的。除非其私钥被破解或泄漏。当前程序集会为每一个程序集创建公钥记号。由于长度为128字节,如果不使用公钥记号技术的话一个程序集引用许多其他程序集后会变得很大。

 

为程序集签名

  • 方法1:使用csc.exe编译器的/keycontainer和/keyfile选项
  • 方法2:使用Visual Studio 2005的项目属性>签名>为程序集签名
  • 方法3:使用AssemblyKeyFile Attribute,其接受一个.snk文件作为名称。

推荐使用前两种方式给程序集签名,方法3后产生编译警告。

当对程序集签名时,编译器在程序集的内部包含一个数字签名及公钥部分。程序集内容默认使用的散列算法为SHA-1(Secure Hash Algorithm,安全散列算法)。可以通过AssemblyAlgorithmId attribute(接收一个AssemblyHashAlgotithm枚举值表示算法)来制定自己希望使用的散列算法,如MD5。

    编译器使用私钥加密程序集的散列值并得到一个程序集的数字签名。公钥插入清单的AssemblyRef表中,而数字签名则插入到CLR文件头的特殊部分当中。

下图展示了给程序集加密的过程。

 

如:源文件编写于Test.cs中,要相对此程序集使用生成的测试密钥TestKeys.snk签名,可以使用如下语句:

>csc.exe /keyfile:TestKeys.snk Test.cs

使用sn.exe -T Test.exe可以查看公钥记号。

 

程序集的延迟签名

.NET中的延迟签名(delayed signature)的机制用于大部分开发人员在不能访问私钥的情况下进行应用的签名测试。

延迟签名实现的方法:

第一步,创建一个只包含公钥部分的.snk文件。

    sn.exe -p MyKeys.snk MyPublic.snk

MyPublic.snk文件可以分发给开发人员,此文件代替包含有公钥/私钥对的真实key对程序集进行签名。可以将其传入AssemblyKeyFileAttribute,并用true初始化AssemblyDelaySignAttribute。这时编译器虽然不会进行真实的签名,但会保留签名的空间。

当最后要进行真是签名时,只需要简单的使用如下命令,并传入有效的Key即可。

sn.exe -R Test.exe MyKeys.snk

只需这个命令即可对延迟签名的程序集完成签名。

posted @ 2009-01-28 16:53  hystar  阅读(1672)  评论(2编辑  收藏  举报