CLR 学习二 强命名程序集(strongly named assembly)和弱命名程序集(weakly named assembly).

今天主要学到了强命名程序集(strongly named assembly)和弱命名程序集(weakly named assembly).

先介绍下 "私有部署的程序集"和"全局部署的程序集"
"私有部署的程序集"是指部署到应用程序基目录或一个子目录中的程序集。
"全局部署的程序集"是指部署到一些已知位置的程序集;CLR在查找程序集时,会检查这些位置。

 

强命名程序集合弱命名程序集主要的区别是:
强命名程序集使用发布者对公钥/私钥对进行了签名,它唯一性地标识了程序集的发布者(就是程序集具有发布者签名的唯一标识“公钥/私钥”,每个公钥和私钥都是唯一不重复的。是可以私有部署和全局部署的),而弱命名程序集有没有该标识的在某种情况下几个弱命名程序集有可能具有相同的弱名称。


一个强命名的程序集具有4个重要的属性:
1.一个文件名(不计扩展名)
2.一个版本号
3.一个语言文化标识
4.一个公钥。(由于公钥是非常大的数字,所以经常使用从公钥派生的一个小的哈希值。这个哈希值称为公钥标记(public key token))

以一下程序集标识字符串(有时称程序集显示名称)标识了4个不同的程序集文件

第一个字符串标识了一个名为 MyTypes.exe或者MyTyoes.dll的程序集文件(无法根据“程序集标识字符串”判断文件扩展名).版本号是 1.0.8123.0,而且程序集中没有任何内容与一种特定的语言文化关联,因为CuIture 设为neutral.


当然,任何公司或开发者都可以生成一个一模一样的程序集名、版本号、和语言文化。所以,必须有一种方式区分恰好具有相同attributes(属性)的两个程序集。

Microsoft选择使用标准的公钥/私钥加密技术,而不是使用其他唯一性标识技术,比如GUID(Globally Unique ldentifier,全局唯一标识符)、URL(Uniform Resource Locator,统一资源定位符)或者URN (Uniform Resource Name,统一资源名称).具体说,使用加密技术,不仅能再程序集安装到一台机器上时检查其二进制数据的完整性,还允许每个发布者都能授予一套不同的权限。

 

创建强命名程序集
1.使用Strong Name实用程序(SN.exe)来获取一个密钥,这个使用程序是与.NET Framework SDK 和Microsoft Visual Studio 配套提供的。运行
SN.exeSN -k MyCompany.snk


这一行告诉SN.exe创建一个名为MyCompany.snk的文件。文

件中包含二进制形式的公钥和私钥。

公钥数字非常大:如果愿意,在创建了包含公钥和私钥的文件后,可再次使用SN.exe 实用程序来查看实际的公钥。为此,必须执行两次SN.exe实用程序。
首先,要用-p 开关执行SN.exe,创建一个只包含公钥的文件(MyCompany.PublicKey);

SN -p MyCompany.snk MyCompany.PublicKey


接着用-tp开关执行SN.exe,并指定只包含公钥的文件:

SN -tp MyCompany.PublicKey


上述命运行的输出如下:

注意:SN.exe 实用程序未提供任何方式显示私钥

公钥标记是公钥的64位哈希值。SN.exe的-tp开关在输出结果的未尾显示了与完整公钥对应的公钥标记。

 

知道了如果创建一个公钥/私钥对后,现在来创建强命名程序集。编译程序集时,要使用/keyfike:<...>编译器开关:

csc /keyfile:MyCompany.snk app.cs



C#编译器看见这个开关,就会打开指定的文件(MyCompany.snk),用私钥对程序集进行签名,并将公钥嵌入清单。注意:只能对包含清单的程序集文件进行签名;程序集的其他文件不能被显式地签名。

要在Visual Studio 中新建一个公钥/私钥文件,可显示项目属性,进入"签名"选项卡,勾选“程序集签名”,然后从“选择强名称密钥文件”框中选择“<新建...>”。

 

 

当我们说“对一个文件进行签名”时,确切的含义是:生成一个强命名程序集时,程序集的FileDef清单元数据表列出了构成程序集的所有文件,每次讲一个文件的名称添加到清单中,文件的内容都会进行哈希处理,得到的哈希值会和文件名一道存储在FileDef表中。要想覆盖默认的哈希算法,可使用AL.exe 的/algid开关,也可在程序集的某个源代码文件中,在 assembly 这一级上应用 System.Reflection.AssemblyAlgorithmIdAttribute 这个定制 attribute(属性).默认使用的是SHA-1算法,它对几乎所有应用程序来说都足够了。

 

 

生成了包含清单的PE文件后,会对PE文件的完整内容(任何 Authenticode Signature、程序集强名称数据以及PE 头校验和除外)进行哈希处理,如图下图:


此时使用哈希算法始终是SHA-1,而且不可以更改。 这个哈希值使用发布者的私钥进行签名,最终得到的RSA数字签名会存储到PE文件的一个保留区域中(进行哈希处理时,会忽略这个区域).PE文件的CLR头会进行更新,反映出数字签名在文件中嵌入位置。

 

 

发布者公钥也嵌入了这个PE文件的AssemblyDef清单元数据表中。文件名、程序集版本号、语言文化以及公钥的组合为这个程序集赋予了一个强名称,它保证是惟一的。除非共享密钥对,否则即使都生成了一个名为Calculus 的程序集,公钥/私钥也不可能相同。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值