现在的位置: 首页 > 综合 > 正文

强签名的由来和作用

2018年01月22日 ⁄ 综合 ⁄ 共 1155字 ⁄ 字号 评论关闭

在网上,看到很多初学.NET的网友经常问,强签名是什么,它的作用是什么?一句话,强签名就是唯一标识一个Assembly文件的名称。它由Assembly的文件名、版本号、区域信息、公钥信息和处理器架构信息组成,这样做是为了避免以前Windows里面的DLL HELL问题。

 

在强名以前,如果一个DLL升级覆盖了老版本的DLL,有可能会导致系统里面一些依赖老版本的DLL程序出现兼容型的问题。这是因为新版本里面可能将老版本DLL的一些函数的实现方法改变为了修复一些Bug,因此强签名就将程序的版本信息作为唯一标识Assembly的一部分。

 

.NET又因为历史原因,在开发的时候由于PC还没有64位的处理器可以使用,因此虽然.NET程序编译成MSIL中间代码以后,CLR可以根据所运行的机器的处理器架构生成对应的代码。但是还是有一些Assembly模块是依赖于指定平台的,例如CustomMarshalers.dll,这个DLL调用了一些unsafe代码,里面有一些指针操作,因此这个dll是依赖于指定平台的。因此在2.0.NET以后,强签名就将程序所依赖的处理器信息也作为其一部分。

 

另外由于很多公司都需要开发国际化软件产品,一般希望只保留一份代码,然后将代码里面用到的字符串放到其他Assembly里面 这个Assembly叫做资源Assembly。在代码Assembly使用字符串的时候,只要指定字符串在资源Assembly对应的标识符,在做本地化的时候,软件发布厂商只需要为需要支持的语言添加对应的资源Assembly就可以了。比如mscorlib.dll里面会扔出很多的异常,为了能为不同国家的.NET用户显示本地化的异常消息,mscorlib.dll将所有异常消息都提取到资源Assembly里面,因此你会看到系统里面安装了mscorlib.en-us.dllmscorlib.zh-cn.dll等等。使用.NETResourceManager类可以根据字符串标识符将资源Assembly里面对应的字符串和其他资源(有些图片也需要本地化,例如改变图片上的文字)提取出来,因此强签名就将程序支持的区域信息作为它的一部分。

 

组件发布了以后,如何想其他人证明组件就是你发布的?例如在下图的例子中,张三和黑客的程序都发布给王二,两个程序都声称自己是张三提供的,王二如何区别哪个才是真的张三呢?

 

 

因此我们有了数字签名这个解决方案,在下图的例子中:

  1. 张三先将自己的身份和公钥注册在权威机构里面。
  2. 张三发送代码给用户。
  3. 用户去权威机构去查询张三的身份是否和他声明的相符。
  4. 黑客发送代码给用户。
  5. 用户去权威机构查处代码声明的身份和它实际的身份不符。因此就可以采取保护措施。

 

 

因此公钥作为强签名的一部分就不是很奇怪了。

 

抱歉!评论已关闭.