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生成的程序集进行签名的更多相关文章

  1. Sn.exe(强名称工具)

    Sn.exe(强名称工具) .NET Framework 4.5   强名称工具 (Sn.exe) 有助于使用强名称对程序集进行签名. Sn.exe 提供了用于密钥管理.签名生成和签名验证的选项. 强 ...

  2. .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

    阐述签名工具这个概念之前,我先说说它不是什么: 1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集进行反编译一毛钱关系都没有. 2.它很讨厌人们把它和加密联系在一起. 我 ...

  3. 转载:.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

    .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法 阐述签名工具这个概念之前,我先说说它不是什么: 1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集 ...

  4. 【转】.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

    阐述签名工具这个概念之前,我先说说它不是什么: 1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集进行反编译一毛钱关系都没有. 2.它很讨厌人们把它和加密联系在一起. 我 ...

  5. .net程序集强名称签名实践

    引用:  http://www.cnblogs.com/cpcpc/archive/2011/01/17/2123086.html 强名称是由程序集的标识加上公钥和数字签名组成的.其中,程序集的标识包 ...

  6. 使用sn.exe为程序集签名

    前言 在写上一篇随笔时,为理解EF事务底层的原理,我去Github上把EF的源码下载放到自己项目调试,不过在编译时遇到了下面这个报错信息.经过一番查阅,了解到了程序集签名(也称强名称签名)的概念.报错 ...

  7. 生成秘钥文件 sn.exe(Strong Name Tool)

    Visual Studio 内置 Strong Name Tool, 我们直接运行"VS开发人员命令提示"就可以生成秘钥文件. 秘钥文件包含公钥和私钥. 来看这个例子: 在文件夹下 ...

  8. 程序集生成失败 -- 引用的程序集“ThoughtWorks.QRCode”没有强名称,为没有源码的程序集强签名

    如果你写的程序程序集是带签名的,应用了没有签名的程序集,编译就会报下面的错误 引用的程序集“**”没有强名称 进入sdk提示符界面,依次输入如下指令 sn -k ThoughtWorks.QRCode ...

  9. 未能加载文件或程序集“BLL”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。

    今天使用VS2012创建项目的时候,考虑到项目中代码的重用性以及清晰简洁性,搭建了一个三层架构,但是在项目运行的时候,总是报错: “未能加载文件或程序集“BLL”或它的某一个依赖项.生成此程序集的运行 ...

随机推荐

  1. EF那点事

    EntityFramework 1-->什么是EnitityFramework   1.1--> ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出 ...

  2. 仿58同城UITableViewCell动画

    之前看58同城APP有一个页面中Cell依次从右向左移动,今天试着做了下. 在做的过程中也遇到了几个小的问题,也算是注意点吧. 1.Cell出现时每个Cell的动画时间一样,导致没有依次移动的效果. ...

  3. 如何让自己的网站也能实现HTTPS访问 阿里云 转

    转 自  http://jingyan.baidu.com/article/90895e0fd9903164ec6b0bf7.html?qq-pf-to=pcqq.group 最近搞微信小程序,服务器 ...

  4. Java - 关于泛型

    自Java 1.5开始使用的泛型,泛型给人比较直观的印象是..."尖括号里写了类型我就不用检查类型也不用强转了". 确实,那先从API的使用者的角度上想问题,泛型还有什么意义? D ...

  5. 如鹏网学习笔记(九)JavaScript

    JavaScript笔记 一.JavaScript简介 1,JavaScript是一种计算机编程语言,可以像等其他编程语言那样定义变量,执行循环等. 2,JavaScript代码主要执行在浏览器上,为 ...

  6. linux服务器上部署jdk+tomcat+rocketmq+redis-cluster

    通常我们拿到一组干净的linux服务器,需要初始化安装一些基础软件,这里一站式介绍部署jdk+tomcat+rocketmq+redis-cluster 前言:如果要在多台服务器上安装,在一台服务器上 ...

  7. slider轮播插件的多种写法

    slider轮播插件相信大家经常会用到,写法也是各种各样,大部分都是用的第三方提供的组件使用,如果想基于自己的业务特点封装个组件供自己使用的话就要自己封装组件了,网上看了大部分写法都是通过js控制do ...

  8. DOM基础操作(一)

    DOM的基本操作有四种,我们会逐一给大家进行展示 增加操作 1.创建元素节点 createElement 我们可以通过document.createElement(‘div’);这个方法来创建一个元素 ...

  9. python保存字典和读取字典pickle

    import pickle import numpy as np def save_obj(obj, name): with open(name + '.pkl', 'wb') as f: pickl ...

  10. idea 常用快捷键 笔记

    1. main方法 输入psv tab或回车 类似的 psf fori (for循环) sout 备注:  通过ctrl+j 可以查询 2. 删除当前行 ctrl + y 3. 复制当前行 ctrl ...