使用.强命名.程序集签名.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
使用.强命名.程序集签名.doc

在部署程序集到GAC前,必须赋予它一个强名称,强名称用于标识给定.NET二进制文件的发行者。“发行者”可以是一个独立程序员,可以是某公司的一个部门,还可以是整个公司。 在一定程度上可以说,强名称在.NET中的作用好比全局唯一标识符(GUID)在COM中的作用。如果学过COM编程,你会想起AppID是标识特定COM应用程序的GUID。与COMGUID值(只是128位的二进制数字)不同,强名称是基于两个密码学上双关的钥(公钥和私钥)的,这种机制比起GUID更具唯一性和抗篡改性。 强名称由一组相关数据组成。我们可以使用程序集级别的特性来定义其中的大部分数据: ? 程序集的友好名称(程序集名称减去文件扩展名)。 程序集的版本号(使用[AssemblyVersion]特性赋值)。 公钥值(使用[AssemblyKeyFile]特性赋值)。 用于本地化的可选的区域性标识(使用[AssemblyCulture]特性赋值)。 嵌入的数字签名,使用基于程序集内容的散列值和私钥值生成。 为了给一个程序集赋予强名称,首先需要使用.NET Framework 2.0 SDK 的sn.exe工具生成公钥私钥对。sn.exe工具生成一个文件(通常以*.snk(Strong Name Key)作为文件扩展名),该文件包含两个不同的但算术上相关的钥:“公”钥和“私”钥。一旦C#编译器确定*.snk文件的位置,它就会在编译过程中使用.publickey标记把公钥值记录到程序集清单里。 另外,C#编译器还会产生一个基于整个程序集内容(CIL代码、元数据等)的散列值。在第3章已经讲过,散列值是对于某一固定输入的独一无二的数值输出。因此,如果更改了.NET程序集的内容(就算只是改变一个字符),编译器将产生完全不同的散列值。散列值结合*.snk文件中的私钥组成数字签名。数字签名将被嵌入到程序集的CLR首部数据中。产生程序集的强名称的整个过程如图11-17所示。 实际的私钥并不在程序集清单中列出,它只用做对程序集内容进行数字签名(结合生成的散列值)。重申一点,使用公钥私钥这个密码学概念,完全是为了确保在.NET领域中,没有任意两个公司、部门或个人拥有相同的标识。程序集被赋予强名称后,就可以安装到GAC中。 注解??? 强名称同时为程序集提供了一定程度的保护,防止程序集被篡改。因此,.NET建议为每一个程序集都赋予一个强名称,无论该程序集是否被安装到GAC。 数字签名 ? 程序集 散列码 ? CarLibrary.dll ? 私钥数据 ? 数字签名 ? CIL ? 类型元数据 ? 清单(带公钥) ? 图11-17? 编译期间,C#编译器将基于公钥和私钥数据生成数字签名,并把它嵌入到程序集中 11.6.2? 为CarLibrary.dll赋予强名称 让我们动手为先前创建的CarLibrary.dll赋予强名称(使用Visual Studio 2005打开我们的项目)。首先使用sn.exe工具生成需要的密钥。尽管sn.exe拥有众多命令行参数选项,但现在只需要关心-k标记,它会要求sn.exe工具生成一个包含公钥私钥对的新文件。在硬盘C区创建一个名为MyTestKeyPair的文件夹,打开.NET命令提示窗体转到该目录下,输入以下命令生成MyTestKeyPair.snk文件: ? sn -k MyTestKeyPair.snk? ? 公钥私钥对生成后,接着需要把MyTestKeyPair.snk文件的位置告诉C#编译器。如果使用Visual Studio 2005创建任何新的C#项目,都会发现初始项目文件(位于解决方案资源管理器的Properties节点)中包含一个AssemblyInfo.cs文件。这个文件包含了大量描述程序集自身的特性。AssemblyKeyFile就是其中一个程序集级别的特性,它用于告诉编译器有效的*.snk文件的位置所在。下面使用一个字符串来定义该位置: ? [assembly: AssemblyKeyFile(@C:\MyTestKeyPair\MyTestKeyPair.snk)] ? 由于共享程序集的版本号也作为强名称的一部分,因此为CarLibrary.dll定义一个版本号。在AssemblyInfo.cs文件里,会看到另外一个名为AssemblyVersion的特性。先把它的值设为1.0.*: ? [assembly: AssemblyVersion(1.0.*)] ? 在本章一开始讲到,.NET版本号由4个部分组成(major.minor.build.revision)。如果保持上面的设置,Visual Studio 2005会自动在编译时增加固定版本值(使用了*通配符标记)。当然,我们也可以为程序集设

文档评论(0)

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档