当前位置: 首页 > 编程日记 > 正文

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

强命名程序集能防篡改

用私钥对程序集进行签名,并将公钥和签名嵌入程序集,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

相关文章:

堆和栈的区别(面试经验总结)

C中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。 堆:是由new分配的内存块,由程序员…

百度Q3财报里的“大生意”

在今日发布的Q3财报中,百度花了不少篇幅来介绍人工智能业务的进展,作为百度的技术核心,近段时间几乎所有百度业务都在与人工智能做深入结合,这预示着移动互联网信息化技术发展已经全面开启人工智能时代,而百度势必要在…

【Codeforces/HDU】76A Plus and xor / 2095 find your present (2)(异或)。

http://codeforces.com/contest/76/problem/D A X Y B X xor Y 异或(不进位加法):两个二进制数,对应的位置上,相同为0,不同为1 性质:a^a0,a^0a,满足交换律 所以…

前端项目如何管理

前端项目如何管理 前端项目的管理分为两个维度:项目内的管理与多项目之间的管理。 1. 项目内的管理 在一个项目内,当有多个开发者一起协作开发时,或者功能越来越多、项目越来越庞大时,保证项目井然有序的进行是相当重要的。 一般会…

CMake学习(一)

什么是 CMake 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行…

【Codeforces】1104C Grid game (变异的俄罗斯方块)

http://codeforces.com/problemset/problem/1104/C 4 X 4 的方格 放置 1*2的矩形(用1表示)和2*1的矩形(用0表示) 只要有一行或者一列都填满了,就会自动消除,就可以放心的矩形了,只要不重叠就可…

如何创建.gitignore文件,忽略git不必要提交的文件

1、在需要创建 .gitignore 文件的文件夹, 右键选择Git Bash 进入命令行,进入项目所在目录。 2、输入 touch .gitignore ,生成“.gitignore”文件。 3、在”.gitignore” 文件里输入你要忽略的文件夹及其文件就可以了。(注意格式) …

软件安全访谈:ZipSlip、NodeJS安全性和BBS攻击

正如Nodejs Security WG成员和Snyk开发者布道师Liran Tal所写的那样,自BBS早期以来,这种漏洞利用的矢量攻击已经为人所知。InfoQ采访了Tal,了解了更多有关软件安全性(尤其是Nodejs安全性)的相关信息。今年早些时候&…

客户端与服务器的数据交互

毕设需要接粗到一些关于app和前端后端的东西,学习记录一下。 首先不要管安卓端还是苹果端,现在一般都是响应式的app,放到安卓或者苹果或者pc或者平板都是没有问题的。一般采用的是http接口通讯,或者socket连接。具体你要去查资料…

【Codeforces】908B New Year and Buggy Bot(暴力+全排列)

http://codeforces.com/contest/908/problem/B 0 1 2 3 可以对应 上下左右。(具体哪个对应哪个,试过才知道) str 的 长度 为 100,0 1 2 3 的全排列一共24种,最坏的情况可以看成遍历长为2400的字符串,不会…

swoole实现数据库连接池

2019独角兽企业重金招聘Python工程师标准>>> 原生 PHP CURD 让我们来回顾一下PHP中数据库的使用 <?php # curd.php$id 1;$dbh new PDO(); $stmt $dbh->prepare(SELECT * FROM user WHERE id:id); $stmt ->bindValue(:id, $id); $user $stmt->f…

bats-Bash自动化测试工具

本文分析了bats--Bash自动化测试工具的安装、语法、常用指令及常用函数等内容。上篇文章回顾&#xff1a;学习RAID 01/10/10E的区别bats 是一个符合 TAP 标准 的 Bash 版测试框架&#xff0c;它使用了一种极为简便的方法来验证命令行程序是否正常运行。bats 要求 Bash 的最低版…

ORB + OPENCV

一、介绍 假如有两张人物图片&#xff0c;我们的目标是要确认这两张图片中的人物是否是同一个人。如果人来判断&#xff0c;这太简单了。但是让计算机来完成这个功能就困难重重。一种可行的方法是&#xff1a; 分别找出两张图片中的特征点描述这些特征点的属性&#xff0c;比较…

【Codeforces】967C Stairs and Elevators (二分)。

http://codeforces.com/contest/967/problem/C 从一个地方到另一个地方&#xff0c;可以选择爬楼梯或者坐电梯 &#xff0c;前提是楼梯或者电梯存在。 n 楼层数 m 每一层的房间数 s 楼梯的数量 e 电梯的数量 v 电梯的速度 第2行是s个楼梯的位置 第3行是e个电梯的位置 …

webpack 最简打包结果分析

原文链接&#xff1a;https://ssshooter.com/2019-02... 现在的 webpack 不再是入门噩梦,过去 webpack 最让人心塞的莫过于配置文件&#xff0c;而 webpack4 诞生随之而来的是无配置 webpack。 使用 webpack4&#xff0c;至少只需要安装 webpack 和 webpack cli。所以大家完全可…

orb-slam2(学习笔记)+相机

单目&#xff08;Monocular&#xff09;、双目&#xff08;Stereo&#xff09;、深度相机&#xff08;RGB-D&#xff09; 深度相机能够读取每个像素离相机的距离 &#xff0c;单目相机 只使用一个摄像头进行SLAM的做法叫做单目SLAM&#xff08;Monocular SLAM&#xff09;,结构…

如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)

运维相关&#xff1a;http://www.cnblogs.com/dunitian/p/4822808.html#iis 先注册一个nuget账号https://www.nuget.org/ 下载并安装一下NuGetPackageExplorer&#xff1a;https://github.com/NuGetPackageExplorer/NuGetPackageExplorer 创建一个包&#xff08;vs其实也是可以…

【Codeforces】1080C Masha and two friends (棋盘染色)

http://codeforces.com/problemset/problem/1080/C 给定一个棋盘&#xff0c;&#xff08;1&#xff0c;1&#xff09;的位置是白色&#xff0c;观察可以知道&#xff0c;如果横纵坐标之和是偶数&#xff0c;那么是白色&#xff0c;奇数的话就是黑色。 只要算出染色以后白色方…

Java多线程001——一图读懂线程与进程

本博客 猫叔的博客&#xff0c;转载请申明出处前言 本系列将由浅入深&#xff0c;学习Java并发多线程。 一图读懂线程与进程 1、一个进程可以包含一个或多个线程。&#xff08;其实你经常听到“多线程”&#xff0c;没有听过“多进程”嘛&#xff09;2、进程存在堆和方法区 3、…

TermCriteria模板类

学习写vo过程中遇到的 类功能&#xff1a;模板类&#xff0c;作为迭代算法的终止条件。 构造函数&#xff1a; TermCriteria(int type,int maxCount,double epsilon); 参数说明&#xff1a; type 迭代终止条件类型 typeTermCriteria::MAX_ITER/TermCrite…

SQL优化快速入门

最近遇到一个专门进行SQL技术优化的项目&#xff0c;对很多既有的老存储过程进行调优&#xff08;现在已经不再新增任何存储过程&#xff09;&#xff0c;因此系统的对SQL语句编写进行一次科学的学习变得很有必要。这儿将基于黄德承大神的Oracle SQL语句优化一书&#xff0c;选…

【HDU】4509 湫湫系列故事——减肥记II (区间覆盖 暴力)

http://acm.hdu.edu.cn/showproblem.php?pid4509 给出的时间段是被占用的时间&#xff0c;24h 1440 min&#xff0c;求出这些区间以外的区间长度 把00&#xff1a;00 - 23&#xff1a;59 变成0-1440 1-5都是被占用的区域&#xff0c;暴力很好理解 #include <iostream>…

Java并发编程71道面试题及答案

Java并发编程71道面试题及答案 1、在java中守护线程和本地线程区别&#xff1f; java中的线程分为两种&#xff1a;守护线程&#xff08;Daemon&#xff09;和用户线程&#xff08;User&#xff09;。 任何线程都可以设置为守护线程和用户线程&#xff0c;通过方法Thread.setDa…

USB获取图像实时处理

手写&#xff36;&#xff2f;的准备工作&#xff0c;调用&#xff35;&#xff21;&#xff22;或者本地相机获取视频图像&#xff0c;读取并保存视频。 #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "openc…

常见数据库 性能

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/582827/blog/778908

【Codeforces】1093C Mishka and the Last Exam

http://codeforces.com/problemset/problem/1093/C 已知b[i]求a[i]和a[n-i1]&#xff0c;n是a数组中元素的个数&#xff0c;a数组的下标从1开始 输出b[1]的时候&#xff0c;直接让a[1] 0&#xff0c;a[n] b[0] 接下来的每一组&#xff0c;先让a[i] b[i]&#xff0c;然后求…

PHP面试常考内容之Memcache和Redis(2)

你好&#xff0c;是我琉忆。继周一&#xff08;2019.2-18&#xff09;发布的“PHP面试常考内容之Memcache和Redis&#xff08;1&#xff09;”后&#xff0c;这是第二篇&#xff0c;感谢你的支持和阅读。本周&#xff08;2019.2-18至2-22&#xff09;的文章内容点为以下几点&am…

毫米波雷达、ADAS中的应用以及毫米波雷达的检测、测距、测速和角度测量

毫米波雷达的检测、测距、测速和角度测量 毫米波(Millimeter-Wave&#xff0c;缩写&#xff1a;MMW)&#xff0c;是指长度在1~10mm的电磁波&#xff0c;对应的频率范围为30~300GHz&#xff0e;根据波的传播理论&#xff0c;频率越高&#xff0c;波长越短&#xff0c;分辨率越高…

【VMC实验室】在QCloud上创建您的SQL Cluster(1)

在国内公有云厂商上搭建一套SQL Cluster的难度相信做Windows的童鞋都会很清楚&#xff0c;并非它的搭建有多少难度&#xff0c;只是很多细节需要注意。腾讯云&#xff0c;QCloud&#xff0c;为什么选择QCloud来做这个实验&#xff0c;除了QCloud是我的东家&#xff08;啊呸&…

【Codeforces】808D Array Division(前后两部分和相等)

http://codeforces.com/contest/808/problem/D 给你一个数组&#xff0c;问&#xff1a;是否可以通过移动一个数字的位置&#xff0c;求只能移动一次&#xff0c;使得这个数组前后部分的和相等&#xff0c;前后部分不一定等长 一个a数组储存数据&#xff0c;另一个b数组b[i]表…