读书笔记—CLR via C#章节3
这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享。
强命名程序集
优点
- 程序集共享
- 版本共存,解决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或加载程序集失败
结语
说实话,本节中有少数部分自己也是停留在一知半解的程度,没有做实际验证,好读书不求甚解,以后有需要一定会仔细验证的!
读书笔记—CLR via C#章节3的更多相关文章
- 读书笔记—CLR via C#章节11-13
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#章节8-10
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#章节4-7
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#章节1-2
这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深 ...
- 读书笔记—CLR via C#线程27章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#同步构造28-29章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#线程25-26章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#异常和状态管理
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#反射
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
随机推荐
- oracle数据库全然恢复和不全然恢复以及运行用户管理辈分恢复
比較全然恢复和不全然恢复: 一.全然恢复:将数据库恢复到当前最新状态,包含直至请求恢复时进行的全部已提交的数据更改 二.不全然恢复:将数据库恢复到请求恢复操作之前指定的过去时间点 一.全然恢复过程 以 ...
- The Toast in android
Toast can show the help/prompts to user. There have five effect of toast as bellow: 1.default effect ...
- 应用ExcelPackage导出Excel
前阵子工作需要,要实现从数据库中导出数据到Excel.老套路 先去百度上查阅资料,发现了以下几种方法: 1:将DataGrid控件中的数据导出Excel 2:将dataview导出excel 3:从网 ...
- (大数据工程师学习路径)第三步 Git Community Book----中级技能(下)
一.追踪分支 1.追踪分支 在Git中‘追踪分支’是用于联系本地分支和远程分支的. 如果你在’追踪分支'(Tracking Branches)上执行推送(push)或拉取(pull)时,它会自动推送( ...
- tomcat-jQ-springMVC-bootstrap
基于tomcat-jQ-springMVC-bootstrap的公司产品管理WEB应用 管理员登录后台以后才能操作 ,权限管理只有一个管理员, 系统的主要作用是查看所有的 “公司列表”, 并查看该公司 ...
- Git & Github 一页简明笔记(转)main
由于小组工程需要使用git&github的版本控制来协作,但我对其使用并不熟悉,特此写篇一页的笔记放在手边,备随时查阅. 使用方法:常用命令供随时查阅,其余内容供新手了解. 0. 常用命令一览 ...
- C++ Primer Plus 文章17章 进,输出和文件
文章17章 进.输出和文件 1.当到达输入句子.他将刷新输出缓冲区满输出电流 2.streambuf分类 它提供了用于各种操作的一个缓冲 ios_base类表示流的一般特征 ios基础的类ios_ba ...
- UBUNTU如何改变mysql默认文件夹数据文件夹
停止mysql维修 * sudo /etc/init.d/mysql stop 原始文件夹的副本 * cp -r /var/lib/mysql /home/yourname/somewhere 改动权 ...
- 大数据系列修炼-Scala课程08
接下来会讲解关于各种模式匹配,从中就会知道模式匹配的重要性 关于Type.Array.List.Tuple模式解析 1.Type模式匹配代码解析 //关于Type类型的模式匹配 //匹配 Int类型. ...
- URAL 1404. Easy to Hack! (模拟)
space=1&num=1404">1404. Easy to Hack! Time limit: 1.0 second Memory limit: 64 MB When Vi ...