您的位置:首页 > 其它

共享程序集和强命名程序集

2015-11-23 09:04 274 查看
1、DLL HELL:假如两个程序集都复制到同一个已知的目录中,最后一个安装的就是“boss",造成正在使用旧程序集的所有应用程序都无法正常工作。
2、一个强程序集的四个属性:一个文件名、一个版本号、一个语言文化表示、以及一个公钥。公约标记
3、方法:创建一个公钥/私钥对,然后公钥可以同程序集关联。
4、使用SN.exe产生公钥私钥对 SN -k MyCompany.snk

查看实际公钥: SN -p MyCompany.snk MyCompany.PublicKey
SN -tp MyCompany.PublicKey
5、创建一个强命名程序集: csc /keyfile:MyCompany.snk app.cs 此时就会打开指定的文件(MyCompany.snk),用私钥对程序集进行签名,并将公钥嵌入清单。
VS中新建一个公钥/私钥文件,显示项目属性,进入”签名“选项卡,勾选”为程序集签名“,然后从”选择强名称密钥文件“框中选择”新建“
对一个文件进行签名的确切含义:生成一个强名称程序集时,程序集的FileDef清单元数据表列出了构成程序集的所有文件,每次将一个文件的名称添加到清单中,文件的内容都会进行哈希处理,得到的哈希值会和文件名一道存储到FileDef表中。

签名的解释位于下方:

加密和解密:发送方利用接收方的公钥对要发送的明文进行加密,接受方利用自己的

私钥进行解密,其中公钥和私钥匙相对的,任何一个作为公钥,则另一个

就为私钥.但是因为非对称加密技术的速度比较慢,所以,一般采用对称

加密技术加密明文,然后用非对称加密技术加密对称密钥,即数字信封 技术.

签名和验证:发送方用特殊的hash算法,由明文中产生固定长度的摘要,然后利用

自己的私钥对形成的摘要进行加密,这个过程就叫签名。接受方利用

发送方的公钥解密被加密的摘要得到结果A,然后对明文也进行hash操

作产生摘要B.最后,把A和B作比较。此方式既可以保证发送方的身份不

可抵赖,又可以保证数据在传输过程中不会被篡改。

这里有个疑问,如果有人截获了这个数据包,岂不是知道了这个数据加密的公钥私钥吗?那样还有什么秘密可言??

哈希默认使用的算法是:SHA-1算法。想覆盖默认的哈希算法,可使用AL.exe的/algid开关,也可以再程序集的某个源代码文件中,在assembly这一级中应用System.Reflection.AssemblyAlgorithmIdAttribute这个定制的attribute。

生成了包含清单的PE文件后,会对PE文件的完整内容进行哈希处理!这个哈希值使用发布者的私钥进行签名,最后得到的RSA数字签名会存储到PE文件的一个保留区域中。PE文件都CLR头会进行更新,反映出数字签名在文件中的嵌入位置。
发布者公钥也嵌入这个PE文件的AssemblyDef清单元数据表中。

如果判断是否是强名称程序集?可以使用ILDasm程序查看其元数据,里面有一个AssemblyDef记录项就会在Public Key字段之后显示相应的字节。这里存储的是完整的公钥,而不是公钥标记。

6、全局程序集缓存
C:\Windows\Microsoft.NET\assembly
在这个文件夹中因为有分级目录,永远不要手动安装!

GACUtil.exe工具用来安装一个强命名程序集文件。C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools 书上说的工具所在地!要想使用,必须得在cmd窗口下

GAC只能由windows administrators组的组员操作。 主要使用/i /u开关,安装或者卸载;也可以使用/r开关,将程序集与windows的安装与卸载引擎集成到一起。

[Command Prompt]窗口其实就是在cmd窗口

如果将强命名程序集打包到一个.cab文件,使用的时候需要解压成临时文件。当程序集安装好之后,临时文件可以删除。

最终的建议是:程序猿尽量避免全局部署,尽量使用私有部署。

7、在生成的程序集中引用一个强名称程序集
这里会讲到 /reference开关。如果后面的文件名是一个完整的路径,csc.exe会加载指定的文件,并根据它的元数据生成程序集

如果不是一个完整的路径,则会通过其他的方式来寻找这个程序集:
(1)工作目录
(2)包含csc.exe本省的目录,目录中还包含CLR的各种DLL文件
(3)使用/LIB编译器开关指定的任何目录;
(4)使用LIB环境变量指定的任何目录

System.Object是在MSCorLib.dll中定义的。 C:\Windows\Microsoft.NET\Framework64\v2.0.50727 这个程序集文件在这里。

8、安装.net framework时,实际会安装Microsoft的程序集文件的两套拷贝。一套安装在编译器/CLR目录,另一套安装到一个GAC子目录。编译器/CLR目录中的文件方便生成程序集,而GAC中的拷贝方便在运行时加载。但是我没有找到/CLR目录,也没有找到GAC目录

9、将一个强命名的程序集安装到GAC时,系统会执行一次检查,核实含有清单的那个文件没有被篡改。这个检查只在安装时执行一次。除此之外,为了增强性能,如果程序集被完全信任,并加载到一个完全信任的AppDomain,CLR不检查强命名的程序集是否被篡改。相反,从非GAC的一个目录加载强命名程序集时,CLR会校验程序集的清单文件,核实文件的内容未被篡改,造成该文件每次加载都会带来额外的性能开销。

10、延迟签名:关键点将一个强命名的程序集安装到GAC中时,禁止系统验证程序集文件的完整性。(跳过对其哈希值的检查)

延迟开发技术的步骤:
(1)开发程序集期间,获取只包含你的公司的公钥的一个文件,使用/keyfile 和 /delaysign编译器开关编译程序集。
csc /keyfile:MyCompany.PublicKey /delaysign MyAssembly.cs
(2)生成程序集之后,执行以下命令,使CLR暂时信任程序集的内容,不对它进行哈希处理,也不对哈希值进行比较。这使程序集能顺利安装到GAC。现在,可以生成引用了这个程序集的其他程序集,并可随意测试程序集。
SN.exe -Vr MyAssembly.dll
(3)准备好打开和部署程序集时,请获取你的公司的私钥,然后执行以下命令。如果愿意,可以将这个新版本安装到GAC中,但是只有在完成了步骤四之后,才能把它安装到GAC中。
SN.EXE -R MyAssembly.dll MyCompany.PrivateKey
(4)为了在实际环境中测试,重新启用对这个程序集的验证。
SN -Vu MyAsembly.dll

私钥的存储:CSP(Cryptographic Service Provider) 提供了对这些密钥的位置进行抽象的容器。
如果公钥、私钥对在一个CSP容器中,必须为CSC.EXE Al.exe SN.exe程序指定不同的开关。
CSC.EXE /keycontainer ; al.exe /keyname; sn.exe -Rc (进行延迟签名)

11、”运行时“如何解析类型引用?
运行这个应用程序时,CLR会加载并初始化它。然后,CLR读取程序集的CLR头,查找标识了应用程序入口方法(Main)的MethodDefToken.
然后,CLR会检索MethodDef元数据表,找到该方法的IL代码在这文件中的偏移量,把这些IL代码JIT编译成本地代码。编译时会对代码进行验证以确保类型安全性。最后,执行本地代码。

12、发布者策略控制:
作用:当一个程序集安装到用户机器上,就会安装这些策略信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: