使用SN.exe对.Net生成的程序集进行签名
CLR用数字签名的方式防止程序集发布后被人篡改,也可以确定发布人,这个方法就是使用公/私钥对,然后对程序集所有模块取一个哈希生成一个数字签名放在程序集的元数据中。
1、创建公/私钥对
创建公/私钥对有两种方式,一种是通过Visual Studio 命令提示框执行sn -k 密钥.snk方式创建私钥文件;(Visual Studio 命令提示框 最好以管理员方式打开)
第二种是在VS中,在创建的项目名称上右键,打开属性窗口,找到签名栏。
创建出的私钥里包含了公钥和私钥信息,其中私钥436个字节,公钥由128字节内容和一个32字节的头组成。
2、使用公钥进行签名
一般在开发的时候,都会使用延迟签名的功能,因为公钥是公开的,私钥是非公开的,而且私钥一般是保密的。
在项目调试时不能一直申请使用私钥签名,所以微软允许只使用公钥签名,公钥可以从私钥中获取;
通过VS命令提示框中执行sn -p company.snk Company.public.snk命令提取公钥文件;
指定签名文件为生成的公钥文件;
在延迟签名之后的程序是不能直接运行的,如果直接运行,会出现错误。提示强名称验证失败。
我们需要使用sn的-Vr命令告诉CLR在加载程序时,不要对哈希值进行检查:sn -Vr signTest.exe。其中signTest.exe为目标程序集,是C#生成的exe或dll文件。
这个命令只需要执行一次,意思是在本机的CLR上注册一下,不要验证程序集安全性,然后在运行程序就没问题了。
如果需要注销只需执行命令 sn -Vu signTest.exe 即可。
3、使用私钥进行强签名
程序开发完成要进行发布时,调用 sn -Ra signTest.exe Company.snk对程序集进行强签名,这样就拥有防篡改的保护了。
强签名之后 ,CLR每一次加载运行都回验证程序集,如果哈希值与之前生成的公/私钥不匹配,则认为程序已经被篡改,就会阻止程序运行。
4、使用public key token
很多时候可以看到这种引用 SignTestBll.dll,Version=1.0.2.0,Culture=neutral,PublicKeyToken=07f814c98e5c0897
这个PublicKeyToken是干什么的呢?
它其实就是根据公钥的哈希值计算出来的,用来标识一个dll文件的唯一性。
首先使用SHA1算法从公钥等到它的哈希值,取出这个哈希值最后的8个字节,然后把这8个字节倒排一下,就能得到了。
使用SN.exe对.Net生成的程序集进行签名的更多相关文章
- Sn.exe(强名称工具)
Sn.exe(强名称工具) .NET Framework 4.5 强名称工具 (Sn.exe) 有助于使用强名称对程序集进行签名. Sn.exe 提供了用于密钥管理.签名生成和签名验证的选项. 强 ...
- .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法
阐述签名工具这个概念之前,我先说说它不是什么: 1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集进行反编译一毛钱关系都没有. 2.它很讨厌人们把它和加密联系在一起. 我 ...
- 转载:.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法
.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法 阐述签名工具这个概念之前,我先说说它不是什么: 1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集 ...
- 【转】.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法
阐述签名工具这个概念之前,我先说说它不是什么: 1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集进行反编译一毛钱关系都没有. 2.它很讨厌人们把它和加密联系在一起. 我 ...
- .net程序集强名称签名实践
引用: http://www.cnblogs.com/cpcpc/archive/2011/01/17/2123086.html 强名称是由程序集的标识加上公钥和数字签名组成的.其中,程序集的标识包 ...
- 使用sn.exe为程序集签名
前言 在写上一篇随笔时,为理解EF事务底层的原理,我去Github上把EF的源码下载放到自己项目调试,不过在编译时遇到了下面这个报错信息.经过一番查阅,了解到了程序集签名(也称强名称签名)的概念.报错 ...
- 生成秘钥文件 sn.exe(Strong Name Tool)
Visual Studio 内置 Strong Name Tool, 我们直接运行"VS开发人员命令提示"就可以生成秘钥文件. 秘钥文件包含公钥和私钥. 来看这个例子: 在文件夹下 ...
- 程序集生成失败 -- 引用的程序集“ThoughtWorks.QRCode”没有强名称,为没有源码的程序集强签名
如果你写的程序程序集是带签名的,应用了没有签名的程序集,编译就会报下面的错误 引用的程序集“**”没有强名称 进入sdk提示符界面,依次输入如下指令 sn -k ThoughtWorks.QRCode ...
- 未能加载文件或程序集“BLL”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。
今天使用VS2012创建项目的时候,考虑到项目中代码的重用性以及清晰简洁性,搭建了一个三层架构,但是在项目运行的时候,总是报错: “未能加载文件或程序集“BLL”或它的某一个依赖项.生成此程序集的运行 ...
随机推荐
- Spring中使用JMS
JMS为了Java开发人员与消息代理(message broker)交互和收发消息提供了一套标准API.而且,由于每个message broker都支持JMS,所以我们就不需要学习额外的消息API了. ...
- 八段代码彻底掌握 Promise
1.Promise的立即执行性 var p = new Promise(function(resolve, reject){ console.log("create a promise&qu ...
- [译]用R语言做挖掘数据《六》
异常值检测 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到程序: ...
- java读取项目或包下面的属性文件方法
1.使用java.util.Properties类的load()方法 //文件在项目下.不是在包下!! InputStream in = new BufferedInputStream(newFile ...
- 17、多线程 (Thread、线程创建、线程池)
进程概念 *A:进程概念 *a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程的概念 *A:线程的概念 *a ...
- 03-Tomcat服务器
一.Java分类 JavaSE Java的标准版,一般用来开发桌面应用程序, 但是在开发桌面应用程序上相对VB,Delphi,VC++并没有什么优势. JavaEE 也就是Java Enterpris ...
- JavaMail获取已发送邮件
public static void main(String args[]) { Properties props = new Properties(); // 参数配置 props.setPrope ...
- 【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表
转自:https://blog.csdn.net/eson_15/article/details/51506334 这个项目终于接近尾声了,注册功能我就不做了,关于注册功能我的另一篇博客详细的介绍 ...
- sql语句优化总结
sql语句优化总结 数据库优化的几个原则: 1.尽量避免在列上做运算,这样会导致索引失败: 2.使用join是应该用小结果集驱动大结果集,同时把复杂的join查询拆分成多个query.不然join的越 ...
- JSP9大内置对象
JSP9大内置对象 JSP9个内置对象:out对象 用于输出各种数据reuest对象 封装了来自客户端的各种信息response对象 封装了服务器的响应信息exception对象 封装了程序运行过程中 ...