使用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”或它的某一个依赖项.生成此程序集的运行 ...
随机推荐
- Mysql中的分页处理
先来说一下Mysql中limit的语法: --语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset --举例: selec ...
- 【转】Java Spring AOP详解
一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...
- BZOJ1021 [SHOI2008]循环的债务
Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题. 不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务 ...
- web第一章(html)
HTML介绍 HyperText(超文本) Markup(标记) Language(语音) 类似于XML都是由标签组成 xml:是可扩展标记语言,标签可以任意自定义 HTML:不可以使用任意标签,学习 ...
- CentOS7 安装 JIRA 7.2.x 教程:下载、安装、汉化、破解
1.先看视频,参考着能装出个试用版来,不同的地方后面再做说明.JIRA 安装视频(Linux) http://www.confluence.cn/pages/viewpage.action?pageI ...
- 有关平台支持的从经典部署模型到 Azure Resource Manager 的迁移的技术深入探讨
本文将深入探讨如何从 Azure 经典部署模型迁移到 Azure Resource Manager 部署模型. 本文将介绍资源和功能级别的资源,让用户了解 Azure 平台如何在两种部署模型之间迁移资 ...
- java笔记--增加虚拟机内存
--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877243.html "谢谢-- 为避免大型应用程序因虚拟机内存不足而无法 ...
- SQL Server ->> ColumnStore Index(列存储索引)
Columnstored index是SQL Server 2012后加入的重大特性,数据不再以heap或者B Tree的形式存储(row level)存储在每一个数据库文件的页里面,而是以列为单位存 ...
- 关于hashcode 里面 使用31 系数的问题
首先我们来了解一下hashcode,什么是hashcode?有什么作用? hashcode其实就是散列码,使用hashcode使用高效率的哈希算法来定位查找对象! 我们在使用容器来存储数据的时候会计算 ...
- 【Leetcode】【hard】Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...