欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 »  .NET本质论第一卷:公共语言运行库教程 » 正文

本教程章节列表
最新评论

.net本质论-公钥和程序集

创建时间:2012年08月21日 16:13  阅读次数:(6086)
分享到:

CLR利用公钥技术对组件的开发人员进行唯一标识,同时也保护组件,使它在离开原创者之后不被篡改。每个程序集有能标识开发人员的公钥,它嵌入在程序集中。带有公钥的程序集还含有数字签名(digital signature),它是在程序集首次发布之前生成的;数字签名还提供了程序集清单的加密哈希值(hash),而程序集清单本身包含了所有附属模块的哈希值。这样就保证了程序集一旦被发布,程序集中的代码和资源将不再被改变。数据签名能够只使用公钥进行检验;而签名只能带有对应的私钥(private key)才能生成。由此,组织必须更为谨慎在保护私钥。现行的CLR版本利用RSA(RSA是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest、Adi Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。它经历了各种攻击,至今未被完全攻破。)的公钥/私钥技术和加密哈希算法[Secure Hash Algorithm(SHA)](为了防止数据免受意外或者故意(恶意)的修改,数据的完整性通常是由消息身份验证代码或哈希值提供的。哈希值是从数据序列导出的固定长度的数值。哈希值用于验证通过非安全通道传送的数据的完整性。可以将收到的数据的哈希值与传送时数据的哈希值进行比较,以确定数据是否被篡改。)技术产生数字签名。尽管被用作标识程序集的私钥是每个组织的唯一指纹(fingerprint),但它并不提供与数字证书(digital certificate)(数字证书不仅包含用户名和公钥,而且还包含与用户有关的其他信息。)同样级别的认可(nonrepudiation)。例如,仅仅依靠程序集的公钥查找开发人员的身份行不通的。CLR的确支持将为数字认证嵌入到程序集中,但这已经超出了本章的范围(更多信息详见第九章)。

.NET SDK发布了一个工具(SN.EXE),它能够简化开发和部署期间的公钥和私钥的工作环节。SN.EXE的-K选项将创建一个包含公钥/私钥对的新文件。由于这个新文件含有你的私钥,所以,你的操作在格外谨慎,切忌把这个文件存放在不安全的地方。正因为私钥至关重要,大多组织推迟了程序集的实际签署时间,直到正式发布前夕,这被称为延迟签署(delay signing)。为了允许组织中的开发人员不用访问私钥就能够访问公钥,SN.EXE支持使用-P选项消除私钥的影响。这个选项将创建一个只包含公钥的新文件。公钥/私钥文件以及单纯的公钥文件,它们的扩展名都约定为.SNK。

公钥是由SN.EXE产生的,它是一个128字节的不透明的特定算法结构,并带有32字节的附加的头信息。为了压缩程序集引用(和它们的显示名字)的大小,程序集引用可以使用公钥标记(public key token),即完全公钥的8字节散列值。由大多编译器发射的程序集引用通过这个标记取代完全公钥,以保持程序集清单的总体尺寸较小。一个公钥的标记可以通过SN.EXE的-t选项或是-T选项来计算。前者是基于一个只包含一个公钥的.SNK文件来计算,后者是以一个存储在一个程序集清单中的公钥为依据来计算标记。图2.6展示了SN.EXE工具的工作情况。

图2.6:使用SN.EXE管理公钥/私钥

支持CLR的开发工具必须提供某种机制,用于开发人员签署程序集;要么通过定制特性,要么通过命令行开关。System.Reflection.AssemblyKeyFile特性将告诉编译器哪儿能找到.SNK文件,而该文件含有开发人员的公钥。这个特性将与公钥/私钥对或者只与公钥一同发挥作用,允许开发人员在不访问组织的私钥的情形下,能够构建、测试和调试他们的组件。为了构建只使用公钥的程序集,你也必须使用System.Reflection.AssemblyDelaySign特性通知编译器:不存在私钥,也不能生成有意义的数字签名。当采用延迟签署时,空间将预留给数字签名,以便组织中的可靠成员能够重新签署程序集,而不必重复原创者的构建环境。一般情况下,有公钥但不具备有效签名的程序集不能被加载或执行。为了允许在开发时能够使用被延迟签署的程序集,对于特定的程序集或者公钥,这个策略将通过SN.EXE的-Vr选项停止。图2.7展示了从C#中使用的AssemblyKeyFile特性,同时也展示了结果的程序集,以及引用它的其他程序集。注意,128字节的公钥被存储在目标程序集清单中,同数字签名一起来保护程序集免受篡改。还应注意的是,第二个程序集(引用目标程序集的)只包含了8位的公钥标记。由于构建目标程序集时,关闭了延迟签署,因此,程序集能够在安全环境中部署和加载。相比之下,如图2.8所示的C#编译器产生的目标程序集,则不适合部署;这是因为它在构建时,允许延迟签署。不过,当可信任的开发人员用私钥签署程序集之后,程序集就可以被部署了。注意在这个例子中,是带-R选项使用SN.EXE工具的,这将采用基于命令行提供的公钥/私钥覆盖目标程序集中的数字签名。为了手动检验已签署的程序集,你可以使用SN.EXE的-v选项或与-vf选项。其中,后者将覆盖可能取消签名检验的任何设置。



图2.7:强名称程序集引用



图2.8:延迟签署程序集

購 N峇/f顣槝0C
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 17+68=? 的结果(结果是:85)
结  果: