强签名的由来和作用

 

强签名的由来和作用

转载自:http://blog.csdn.net/donjuan/article/details/3859136

在网上,看到很多初学.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.dll,mscorlib.zh-cn.dll等等。使用.NET的ResourceManager类可以根据字符串标识符将资源Assembly里面对应的字符串和其他资源(有些图片也需要本地化,例如改变图片上的文字)提取出来,因此强签名就将程序支持的区域信息作为它的一部分。

 

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

 

强签名的由来和作用_第1张图片

 

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

强签名的由来和作用_第2张图片

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

 

 

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


.Net程序集强签名详解


转载自:http://www.cnblogs.com/philzhou/archive/2012/12/06/2804680.html

强签名:

1. 可以将强签名的dll注册到GAC,不同的应用程序可以共享同一dll。

2. 强签名的库,或者应用程序只能引用强签名的dll,不能引用未强签名的dll,但是未强签名的dll可以引用强签名的dll。

3. 强签名无法保护源代码,强签名的dll是可以被反编译的。

4. 强签名的dll可以防止第三方恶意篡改。

 

强签名的方法:

1. 有源代码:

1.1 使用vs tool command:snk –k mykey.snk 生成签名公钥。

1.2 将公钥加入项目中,并设置项目属性,设置签名公钥

强签名的由来和作用_第3张图片

1.3 重新生成项目。

 

2. 没有源代码。

2.1 创建强签名键:

sn.exe -k key.snk

2.2 反汇编dll为il

ILDASM.exe SomeLibrary.dll /OUTPUT=SomeLibrary.il

该指令会反汇编该dll并生成SomeLibrary.il,如果该dll含有嵌入的resource,

则会有SomeLibrary.res文件产生,并有相应的嵌入资源文件产生。

2.3 重新汇编为dll

ILASM.exe SomeLibrary.il /DLL /OUTPUT=SomeLibrary.dll /KEY=key.snk

如果有嵌入的资源文件,则需要加上 /RESOURCE=SomeLibrary.res

 

强签名的dll与未签名的在反编译后的区别:

未签名的:

强签名的由来和作用_第4张图片

 

强签名的:

强签名的由来和作用_第5张图片

 

更多详细信息参考 StringNaming

http://windowsdevcenter.com/pub/a/dotnet/2003/04/28/strongnaming.html


你可能感兴趣的:(C#,强签名,.net)