CLR 学习二 强命名程序集(strongly named assembly)和弱命名程序集(weakly named assembly).
2013-01-24 18:13
253 查看
今天主要学到了强命名程序集(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,统一资源名称).具体说,使用加密技术,不仅能再程序集安装到一台机器上时检查其二进制数据的完整性,还允许每个发布者都能授予一套不同的权限。
创建强命名程序集
件中包含二进制形式的公钥和私钥。
公钥数字非常大:如果愿意,在创建了包含公钥和私钥的文件后,可再次使用SN.exe 实用程序来查看实际的公钥。为此,必须执行两次SN.exe实用程序。
首先,要用-p 开关执行SN.exe,创建一个只包含公钥的文件(MyCompany.PublicKey);
接着用-tp开关执行SN.exe,并指定只包含公钥的文件:
上述命运行的输出如下:
注意:SN.exe 实用程序未提供任何方式显示私钥
公钥标记是公钥的64位哈希值。SN.exe的-tp开关在输出结果的未尾显示了与完整公钥对应的公钥标记。
知道了如果创建一个公钥/私钥对后,现在来创建强命名程序集。编译程序集时,要使用/keyfike:<...>编译器开关:
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 的程序集,公钥/私钥也不可能相同。
先介绍下 "私有部署的程序集"和"全局部署的程序集"
"私有部署的程序集"是指部署到应用程序基目录或一个子目录中的程序集。
"全局部署的程序集"是指部署到一些已知位置的程序集;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 的程序集,公钥/私钥也不可能相同。
相关文章推荐
- C#学习常用命名空间【1000】---System.Reflection 之Assembly(程序集)类
- 引用、程序集、版本 、强命名 、全局文件 CLR学习第三课
- .NET:CLR via C# Shared Assemblies and Strongly Named Assemblies
- 关于反射中Assembly.Load("程序集").CreateInstance("命名空间.类")与Activator.CreateInstance()方法
- [ZT]Three ways to tell if a .NET Assembly is Strongly Named (or has Strong Name)
- [ZT]如何部署强命名程序集(Strong Name Assembly)和GAC
- CLR Via C# 3rd 阅读摘要 -- Chapter 3 - Shared Assemblies and Strongly Named Assemblies
- 【C#学习】Assembly (程序集)的概念
- CLR via C#--命名空间和程序集
- CLR: 那些你不知道你不知道的事情 程序集(Assembly)和模块(Managed Module)
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_命名空间和程序集的关系
- 《CLR via C#》Part1之Chapter3 共享程序集和强命名程序集(二)
- 如何部署强命名程序集(Strong Name Assembly)和GAC
- 转帖:强命名程序集(Strong Name Assembly)的概念
- [转]clr 强命名程序集和共享程序集
- Assembly generation failed -- 程序集生成失败 -- 引用的程序集没有强名称(转载学习)
- CLR via C# 3 读书笔记(17):第3章 共享程序集和强命名程序集 — 3.1 两种程序集,两种部署方式 & 3.2 对程序集进行强命名
- 『框架设计(第2版)CLR Via C#』学习笔记(002)——将托管代码合并到程序集
- 学习.NET (4) Inside Assembly -研究Assembly的结构,强命名Assembly的生成以及Delayed signing的过程
- CLR基础---共享程序集和强命名程序集(二)