您的位置:首页 > 编程语言 > C#

读书笔记—CLR via C#章节3

2014-10-15 21:14 357 查看
这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享。

强命名程序集

优点

程序集共享

版本共存,解决DLL hell

安全策略(防篡改)

发布策略控制

标识组成

文件名(不计扩展名)+版本号+语言文化+公钥

CLR加载方式

弱命名程序集私有部署,CLR在基目录或子目录中搜索时只使用程序集名称

CLR搜索强命名程序集时,使用完成的程序集标识

创建步骤

使用Strong Name(SN.exe)获取密钥, SN –k MyCompany.snk,该文件包含二进制的公钥和私钥

(可选)SN –p MyCompany.snk MyCompany.PublicKey,创建只包含公钥的文件

(可选)SN –tp MyCompany.PublicKey,查看完整公钥和公钥标记,私钥不可查看

使用csc编译 csc /keyfile:MyCompany.snk app.cs

编译器打开snk文件,用私钥对程序集进行签名,并将公钥嵌入清单

通过FileDef清单元数据查找程序集所有文件

将所有文件进行哈希处理

(可选)哈希算法 AL.exe /algid 或 System.Reflection.AssemblyAlgorithmIdAttribute

(可选)默认使用SHA-1算法

使用哈希算法对PE文件的内容处理,使用私钥签名得到RSA数字签名

签名存储到PE文件的保留区域(防篡改)

PE文件的CLR头会进行更新,反映数字签名在文件中的嵌入位置





公钥标记

公钥标记是公钥的64位哈希值 SN.exe –tp可以查看

程序集定义

AssemblyDef元数据表记录和存储完整的公钥

完整公钥,防止被篡改

程序集引用

AssemblyRef元数据表列出每个强程序集的标识

AssemblyRef实际存储的公钥是哈希处理最后8个字节,简称公钥标记

CLR做出安全或信任决策时,使用公钥而不是公钥标记

GAC

全局程序集缓存(Global Assembly Cache)

目录: .NET 3.5和以前的版本 C:\Windows\Assembly .NET4.0和以后 C:\Windows\Microsoft.NET\Assembly

组织:结构化组织,通过算法生成子目录的名称

建议:永远不要手动复制文件到GAC目录,相反应该使用GACUtil.exe /i安装 /u卸载

建议:GACUtil.exe /r开关,程序集绑定安装和卸载

建议:使用Windows Installer(MSI)可以讲程序集安装到GAC

权衡:违背了简单部署原则(复制目录),一般私有部署就可以了,基于特殊原因使用GAC(如共享)

延迟签名

也称部分签名,只用公钥来生成程序集,暂时不用私钥

没有安全和篡改的问题,因为只是开发阶段延迟,打包部署时还是会签名的

编译开关: csc /delaysign, AL.exe /delay[sign]

打包和部署时,再次使用SN.exe签名,使用-R开关(对文件哈希处理,用私钥进行签名)

将RSA数字签名嵌入到文件中的预留空间

步骤:

编译 csc /keyfile /delaysign

使CLR暂时信任程序集,不做哈希处理,也不对哈希进行比较 SN.exe –Vr MyAssembly.dll

部署时,获取私钥,执行命令 SN.exe –R MyAssembly.dll MyCompany.PrivateKey

实际环境中,执行命令,重新启用程序集验证,SN.exe –Vu – MyAssembly.dll

CLR加载和执行程序集的过程





其他(Tips)

csc编译时,查找程序集在4个地方查找程序集

工作目录

包含CSC.exe本身的目录,目录中还包含DLL的各种文件

使用 /lib 编译器开关指定的目录

使用LIB环境变量指定的目录

注意!以上查找目录仅仅是编译时,运行时不会从这里加载程序集

编译时不区分平台架构,运行时再由CLR加载正确的程序集

运行时的加载程序集顺序

GAC中查找

codeBase指定的URI中查找(安全验证防篡改)

工作目录中查找

.net framework默认安装两套程序集

编译器CLR目录的程序集方便生成

GAC中的拷贝方便在运行时加载

通过比较FileDef清单表存储中的哈希值,不匹配则无法安装GAC或加载程序集失败

结语

说实话,本节中有少数部分自己也是停留在一知半解的程度,没有做实际验证,好读书不求甚解,以后有需要一定会仔细验证的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐