强命名程序集能防篡改

用私钥对程序集进行签名,并将公钥和签名嵌入程序集,CLR就可以炎症程序集未被修改或破坏。程序集安装到GAC时,系统对包含清单的那个文件的内容进行哈希处理,将Hash值与PE文件中嵌入的RSA数字签名进行比较。如果两个值完全一致,表明内容未被篡改。此外,系统还对程序集的其他文件的内容进行哈希处理,并将Hash值与清单文件的FileDef中存储的哈希值进行比较。任何一个哈希值不匹配,表明程序集至少有一个文件被篡改,程序集将无法安装到GAC。

应用程序需要绑定到程序集时,CLR根据被引用的程序集的属性在GAC中找到该程序集。找到被引用的程序集,就返回包含他的子目录,并加载清单所在的文件。以这种方式查找程序集,可保证运行时加载的程序集和最初编译时生成的程序集来自同一个发布者,因为进行引用的程序集的AssemblyRef表中的公钥标记与被引用程序集的AssemblyRef表中的公钥匹配。如果被引用程序集不在GAC中,CLR会查找应用程序的基目录,然后查找应用程序配置文件中标注的任何private路径。然后,如果应用程序由MSI安装,CLR要求MSI定位程序集。如果在任何位置都找不到程序集,那么绑定失败,抛出异常。

如果强命名程序集文件从GAC之外的位置加载,CLR会在程序集加载后比较哈希值。也就是说,每次应用程序执行并加载程序集时,都会对文件进行hash处理,以牺牲性能为代价,保证程序集文件内容没有被篡改。CLR在运行时检测到不匹配的哈希值会抛出异常。

注:将强命名程序集安装到GAC时,系统会执行检查,确保包含清单的文件没有被篡改。这个检查仅在安装的时候执行一次。除此之外,为了增强性能,如果强命名程序集被完全信任,并加载到完全信任的APPDomain中,CLR将不检查该程序集是否被篡改。相反,从那个飞GAC的沐浴露加载强命名程序集时,CLR会校验程序集的清单文件,确保文件内容未被篡改,造成该文件每次加载都造成额外的性能开销。

延迟签名

SN.exe工具生成公钥/私钥对时,会调用Windows提供的Crypto API。密钥可存储到文件或其他存储设备中。例如,大公司会将自己的私钥保存到一个硬件设备中,再将硬件锁进保险库。公司只有少数人才能访问私钥。这项措施可以防止私钥泄露,并保证了密钥的完整性。当然,公钥是完全公开的,可以自由分发。

准备打包自己的强命名程序集时,必须使用受严密保护的私钥对它进行签名。然而,在开发和测试程序集时,访问这项受严密保护的私钥可能有点碍事。因此,.Net提供了延迟签名,该技术也被称为部分签名。延迟签名允许只用公司的公钥生成程序集,暂时不用私钥。由于使用了公钥,引用了程序集的其他程序集会在他们的AssemblyRef元数据表的记录项中嵌入正确的公钥值。另外,它还使程序集能正确存储到GAC的内部结构中。当然,不用公司的私钥对文件进行签名,便无法实现防篡改保护。这是因为无法对程序集的文件进行哈希处理,无法在文件中嵌入数字签名。然而,失去这种保护不是一个大问题,因为只是在开发阶段才延迟签名。打包和部署程序集肯定会签名。

为了实现延迟签名,需要获取存储在文件中的公钥值,将文件名传给用于生成程序集的实用程序。另外,还必须让工具知道你想延迟对程序集的签名,暂不提供私钥。

编译器或AL.exe一旦检测到要对程序集进行延迟签名,就会生成程序集的AssemblyDef清单记录项,其中将包含程序集的公钥。公钥使程序集能正确存储到GAC。另外,这也不妨碍引用了改程序集的其他程序集的正确生成。在进行引用的程序集的AssemblyRef元数据表记录项中,会包含正确公钥。创建程序集时,会在生成的PE文件中为RSA数字签名预留空间。文件内容不会在这个时候进行哈希处理。

目前生成的程序集没有有效签名。安装到GAC会失败,因为尚未对文件内容执行哈希处理——文件表面上已被篡改了。在需要安装到GAC的每台机器上,都必须禁止系统验证程序集文件的完整性。这要求使用SN.exe实用程序并指定-Vr命令行开关。用这个开关执行SN.exe,程序集的任何文件在运行时加载时,CLR都会跳过对其哈希值的检查。

结束程序集的开发和测试之后,就要正式对其签名,以便打包和部署。为了对程序集进行签名,要再次使用SN.exe实用程序,使用-R开关,并指定了包含私钥文件的名称。-R开关指示SN.exe对文件内容进行哈希处理,用私钥对其进行签名,并将RSA数字签名嵌入文件中之前的预留空间。这样,就可以部署完全签好名的程序集。

转载于:https://www.cnblogs.com/renzhoushan/p/10395725.html

共享程序集和强命名程序集(3):强命名程序集的一些作用相关推荐

  1. 第 3 章 共享程序集和强命名程序集

    3.1 节 两种程序集,两种部署 CLR 支持两种程序集:弱命名程序集(weakly named assembly,即无签名的程序集) 和 强命名程序集(strongly named assembly ...

  2. 公共语言运行库中的程序集-04强命名的程序集

    具有强命名的程序集 强命名是由程序集的标识加上公钥和数字签名组成的.其中,程序集的标识包括简单文本名称.版本号和区域性信息(如果提供的话).强命名是使用相应的私钥,通过程序集文件(包含程序集清单的文件 ...

  3. IUSR_ 计算机名和IWAM_ 计算机名帐户的用户名和密码

    IUSR_ 计算机名 和 IWAM_ 计算机名 帐户的用户名和密码存储于以下三个位置: *Internet Information Server (IIS) 配置数据库 *域用户管理器 (Window ...

  4. Oracle数据库名与Oracle实例名的关系

    1 数据库名 1.1 数据库名的概念 数据库名(db_name)就是一个数据库的标识,就像人的身份证号一样.如果一台机器上装了多个数据库,那么每一个数据库都有一个数据库名.在数据库安装或创建完成之后, ...

  5. SQL语句获取数据库名、所有表名、所有字段名及字段类型

    SQL语句获取所有用户名,数据库名.所有表名.所有字段名及字段类型,方法来自于网上,稍加修改 1.获取所有用户名: SELECT name FROM Sysusers where status='2' ...

  6. SQL获取所有用户名,数据库名、所有表名、所有字段名及字段类型

    SQL获取所有用户名,数据库名.所有表名.所有字段名及字段类型2009-03-14 10:481.获取所有用户名:SELECT name FROM Sysusers where status='2' ...

  7. 成功解决 绘图时行坐标名或列坐标名出现f0、f1、f2、f3、f4、f5(或者Column_0、Column_1、Column_2、Column_3)等命名而不是想要的具体对应字段命名

    成功解决 绘图时行坐标名或列坐标名出现f0.f1.f2.f3.f4.f5(或者Column_0.Column_1.Column_2.Column_3)等命名而不是想要的具体对应字段命名 目录 解决问题 ...

  8. oracle 查询表字段6,Oracle 查询库中所有表名、字段名、字段名说明,查询表的数据条数、表名、中文表名、...

    --创建用户 create user "用户名" identitied by "密码": --给自己修改密码 查询所有表名: select t.table_na ...

  9. 【MyBatis】Mybatis的java对象名和数据库表名不同怎么办?

    java对象名 和 数据库表名 不同怎么办? 提问: 我想请教一下,在使用mybatis的注解的时候,如果出现java对象名和数据库表名不同的时候,如何写mapper. 比如,UserAccount是 ...

  10. 信息收集之子域名查询--子域名扫描器: 子域名挖掘机 Subdomainsbrute---基本使用

    信息收集之子域名查询–子域名扫描器: 子域名挖掘机 Subdomainbrute-基本使用 工具介绍:subDomainsBrute 工具作者: lijiejie Github地址:https://g ...

最新文章

  1. Go 知识点(14) — Go 多协程(单个协程触发panic会导致其它所有协程挂掉,每个协程只能捕获到自己的 panic 不能捕获其它协程)
  2. js vm报错_uni-app v3版本更新常见问题排查
  3. Spark系列(八)Worker工作原理
  4. ubuntu 20.04 设置网关_如何把Ubuntu升级到Ubuntu 20.04 LTS 最新版本
  5. QT Creator应用程序开发——01简单按钮显示
  6. 同志亦凡人第五季/全集BQueer As Folk 5迅雷下载
  7. DCF:A Dataflow-Based Collaborative Filtering Trainging Algorithm
  8. 智能用户增长神器QuickAudience开启公共云公测,助力企业业务增长
  9. api postmain 鉴权_WebAPI常见的鉴权方法,及其适用范围
  10. php70w mysql.x8664_LAMP环境的搭建(三)----PHP7的安装
  11. 编程语言流行指数:Python 稳居宝座,Java 滑坡!
  12. SCOM 2012系列⑪单台服务器性能图监控
  13. Weblogic配置jms服务文档,是自己总结网上搜集到的资料以及自己亲自动手配置测试的总结。
  14. root面具怎么授权,面具root权限
  15. 青龙面板+xdd-plusQQ机器人便捷登陆查询保姆级搭建教程
  16. 记事本打开文件乱码的问题
  17. 山大华特卧龙学校第一届ACM赛后总结
  18. android高级面试题!21年Android面经分享,大厂面试题汇总
  19. [OpenAirInterface实战-4] :OAI支持的4G LTE功能集
  20. 【柒穆雨】学习平面设计指南

热门文章

  1. App功能测试的注意点
  2. [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt
  3. JS实现继承的几种方法
  4. PHP中session_register函数详解用法
  5. 一次图文并茂的***完整测试二
  6. Cloneable接口和循环冗余校验算法
  7. POJ 1207 The 3n + 1 problem
  8. 前途到底是网络工程还是程序设计
  9. 9.5. SELINUX
  10. 驼峰命名法模态对话框