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

强命名程序集

优点

  • 程序集共享
  • 版本共存,解决DLL hell
  • 安全策略(防篡改)
  • 发布策略控制

标识组成

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

CLR加载方式

  • 弱命名程序集私有部署,CLR在基目录或子目录中搜索时只使用程序集名称
  • CLR搜索强命名程序集时,使用完成的程序集标识

创建步骤

  1. 使用Strong Name(SN.exe)获取密钥, SN –k MyCompany.snk,该文件包含二进制的公钥和私钥
  2. (可选)SN –p MyCompany.snk MyCompany.PublicKey,创建只包含公钥的文件
  3. (可选)SN –tp MyCompany.PublicKey,查看完整公钥和公钥标记,私钥不可查看
  4. 使用csc编译 csc /keyfile:MyCompany.snk app.cs
  5. 编译器打开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的更多相关文章

  1. 读书笔记—CLR via C#章节11-13

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  2. 读书笔记—CLR via C#章节8-10

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  3. 读书笔记—CLR via C#章节4-7

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  4. 读书笔记—CLR via C#章节1-2

    这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深 ...

  5. 读书笔记—CLR via C#线程27章节

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  6. 读书笔记—CLR via C#同步构造28-29章节

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  7. 读书笔记—CLR via C#线程25-26章节

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  8. 读书笔记—CLR via C#异常和状态管理

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  9. 读书笔记—CLR via C#反射

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

随机推荐

  1. 使用PF_PACKET和SOCK_RAW发送自己定义type以太网数据包

    本文介绍使用PF_PACKET和SOCK_RAW发送自己定义type以太网数据包,使用wireshare抓包能够获取到数据包,为Linux内核添加网络协议做铺垫. 先上码: #include < ...

  2. Azure File Service in IIS

    微软Azure的Storage套件中提供了新的服务File Service,让我们运行在Azure中的程序都能共享存储,一个存储账号共享的没有上线,但每个共享的上限是5G.由于File Service ...

  3. SendRedirect和forward差分

    (1)重定向JSP实现JSP/Servlet跳转到目标资源的方法中,基本的想法是:server目标资源完成URL通过HTTP 在回答本报发client浏览器.收到的浏览器URL更新到地址栏后,而目标资 ...

  4. oracle_体系结构图_逻辑结构图

    1.oracle 的体系结构图  重要!!! 2.oracle的逻辑结构图

  5. Spring学习使用标签来标记资源(@Component、@Repository、 @Service和@Controller)和用法(包括如何jsp正在使用)

    首先,在xml其中新增部分标有下划线的文件,容器初始化的时候需要扫描包 注意: a.     包款扫描(下划线部分)一定要加,默认是不扫描整个包.与每一包之间','开.如过具有同样的父包,那么我们能够 ...

  6. 详解JMeter函数和变量

    JMeter函数可以被认为是某种特殊的变量,它们可以被采样器或者其他测试元件所引用.函数调用的语法如下: ${__functionName(var1,var2,var3)} 其中,__function ...

  7. Msgbox消息框

    于"自"<软件开发工具>一本书有这样的制剂,让我回忆--程序员可以做,让用户做:它允许用户做的少,即使是那些谁需要做的程序设置.我们应该做的. 这不是宣言.该是践行. ...

  8. Gaea是支持跨平台具有高并发、高性能、高可靠性,并提供异步、多协议、事件驱动的中间层服务框架

    Gaea是支持跨平台具有高并发.高性能.高可靠性,并提供异步.多协议.事件驱动的中间层服务框架 Gaea:58同城开源的中间层服务框架 https://github.com/58code/Gaea 中 ...

  9. 网站静态化处理—CSI(5)

    网站静态化处理—CSI(5) 讲完了SSI,ESI,下面就要讲讲CSI了 ,CSI是浏览器端的动静整合方案,当我文章发表后有朋友就问我,CSI技术是不是就是通过ajax来加载数据啊,我当时的回答只是说 ...

  10. POJ 2553 The Bottom of a Graph (强连通分量)

    题目地址:POJ 2553 题目意思不好理解.题意是:G图中从v可达的全部点w,也都能够达到v,这种v称为sink.然后升序输出全部的sink. 对于一个强连通分量来说,全部的点都符合这一条件,可是假 ...