zoukankan      html  css  js  c++  java
  • 反射(2)强名称程序集与数字证书

     

    防止程序集被篡改,可以用两种不同但相互补充的方式对程序集进行签名:使用强名称或使用SignTool.exe(签名工具)

    可以将强名称的数字签名和使用SignTool.exe(签名工具)的证书签名一起提供给程序集,或者您可以单独使用其中之一。这两个签名工具一次只能对一个文件进行签名,对于多文件程序集,您可以对包含程序集清单的文件进行签名 (CLR总是首先加载包含“清单”元素据表的文件,再根据这个“清单”来获取程序集中的其他文件的名称)

    强名称签名的密钥【不必与】签名工具的微软代码签名证书密钥相同。

    一、强名称程序集

    1.         强名称程序集放篡改原理

    强名称程序集图示如下:

    clip_image002

    检查:加载程序集的检查,系统对包含清单的那个文件的内容进行哈希处理,并将哈希值与PE文件中嵌入的RSA数字签名进行比较。系统还会对程序集的其他文件的内容进行哈希处理,并将哈希值与清单文件的FileDef表中存储的哈希值进行比较。

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

    2.         实践强名称签名验证

    通过使用 Microsoft SDK 工具:ildasm.exeIL反汇编工具)改变程序集内容。

    a)         将程序集用 ildasm.exe 工具打开,执行“文件---转储”保存为 .il 文件(同时还会保存一个.res文件),用文本工具打开il文件改变文件内容(如多加一个程序集引用)

    b)         执行“运行---cmd”打开命令行程序,输入:ilasm /resource=*.res *.IL /dll

    此时强名称程序集本身内容已被更改,在CLR执行程序集加载进行强名称签名检查时报如下错误(若为简单程序集不会检查报错):

    clip_image004

    3.         强名称程序集是否安全?   

    知道强名称签名验证后,我们来看看强名称程序集到底附加了什么信息,比如:强名称程序集A 引用强名称程序集B

    -------强名称程序集B本身多出 .publickey 标识

    clip_image006

    -------强名称程序集AB的引用处多出 .publickeytoken 标识

    clip_image007

        通过Microsoft SDK 工具:ildasm.exeIL反汇编工具),我们已经知道可以对程序集内容进行篡改,并且篡改的内容会因为强名称验证而报错。但是:

    a)         如果把如上强名称程序集A .publickey 内容删除,那么A
    就不再是强名称程序集了,即在加载程序集A时不会进行强名称程序集A的篡改检查。那么这时候可以对A
    进行任意更改。

    b)         A引用B时因为有.publickeytoken强名称标识所以要求B是强名称且生成和A中记录的相同公钥标识。如果仅仅删除A.publickeytoken那么会报如下错误:

               1111

    因为找不到指定的强名称标识程序集( (5)CLR 运行时探测程序集引用的步骤》 ),所以我们必须将B .publickey内容一并删除。这样可以实现被引用的程序集任意更改。   

     

    为了解决这个问题,所以我们必须同时使用 SignTool.exe(签名工具)对程序集进行证书签名。

    二、SignTool.exe(签名工具)签名

    签名工具要求发行者向第三方证书颁发机构证实其标识并获取证书。然后此证书将嵌入到您的文件中,并且管理员能够使用该证书来决定是否相信这些代码的真实性。 

    执行如下命令

    生成证书         makecert -r -pe -sv MyCert.pvk MyCert.cer

    生成.pfx            pvk2pfx.exe -pvk MyCert.pvk -spc MyCert.cer -pfx MyCert.pfx

    证书签名         signtool sign /f MyCert.pfx D:\ClassLibrary1.dll

    这样,在查看被签名的程序集属性时会有“数字签名”页签,

    clip_image009

    通过查看证书按钮可查看证书具体信息,确保所使用的文件是由指定产家提供,关于证书如何验证请参见 《数字签名|数字证书》

    那么,既然有证书验证为什么还是需要强名称程序集?因为强名称程序集提供了诸如版本控制、能安装在GAC中等简单程序集不能提供的优点。

     

          《反射机制》系列:

                         (1)程序集基础知识

                         (2)强名称程序集与数字证书

                         (3)程序集加载 Assembly类

                         (4)绑定程序集配置策略

                         (5)CLR 运行时探测程序集引用的步骤

                         (6)程序集加载上下文

                         (7)动态程序集加载Load()

                         (8)程序集反射 Type 类

                         (9)程序集的加载和反射

             相关链接: 《数字签名|数字证书》

    参考书籍:CLR via C#(第3版)



    作者:滴答的雨
    出处:http://www.cnblogs.com/heyuquan/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    欢迎园友讨论下自己的见解,及向我推荐更好的资料。
    本文如对您有帮助,还请多帮 【推荐】 下此文。
    谢谢!!!  (*^_^*)

    技术群:185718116(广深莞·NET技术),欢迎你的加入
    技术群:广西IT技术交流(广西IT技术交流),欢迎你的加入

  • 相关阅读:
    ListBoxAddItems() 不重复添加Edit1
    Get_HD_Serial() 获得磁盘驱动器序列号
    JavaScript是否可实现多线程 — 深入理解JavaScript定时机制
    测测你是否近视!
    [趣闻]Google 员工架飞索去总部蹭饭
    datagridview回车事件
    抄过来的eGroupWare的一些资源
    DataGridView 添加ComboBox
    Chapter 1: Introducing the Project: TheBeerHouse
    Linux操作系统学习线路图
  • 原文地址:https://www.cnblogs.com/heyuquan/p/2427531.html
Copyright © 2011-2022 走看看