SNK 和PDF

news/2024/7/6 1:39:21 标签: assembly, .net, microsoft, dll, basic, 语言

snk 1用来证明这个生成的程序集是你发布的; 2如果你写的程序集要用在多个应用程序上的话,那么这个程序集必须要拥有唯一的名称,这个强名称是程序集唯一名称的一部分。   3只要你保护好你的snk文件不要公布出去,那么没有任何人可以假冒你发布程序集。         强名称签名的原理是不对称签名验证算法。         首先你用sn.exe命令行程序生成一个.snk的密钥文件,这个文件包括了两个部分的内容。     1   私钥,就是在vs.net编译的时候生成验证码的东西。     2   公钥,编译的时候打包到程序集元数据中PublicKey部分的内容。        

而且,验证码只能通过私钥来生成,只有通过私钥生成的验证码才能通过.Net   CLR的验证。         CLR验证程序集的时候通过读取公钥来生成验证对象,生成过后对整个程序集的内容进行验证,拿这个验证码与程序集里面的验证码对比,如果吻合就通过,如果不吻合表示程序集已经被修改了,CLR将拒绝载入这个程序集并且认为需要的程序集没有找到,抛出FileNotFoundException异常。         比如说微软的.Net类库中的System.dll、System.Web.dll等,都经过了强名称验证,保证别人只能使用这些类库,而不能修改,还保证这些程序集是微软推出的。而且,这些程序集是存放在共享目录里面的,更加需要强名称了。

创建SNK文件,2种办法

1 我们在vs.net的命令行模式(开始——〉程序——〉Microsoft Visual Studio.net 2003——〉Visual Studio.net工具——〉Visual Studio.net命令提示)里面输入:sn -k xxxx.snk

xxxx.snk就是你需要的数字签名文件。

使用: 先将snk文件存放到一文件夹(key);在AssemblyInfo.cs文件里面包含有所有版本数字和所有数字签名文件的引用。我们将修改这一文件里面的 [assembly:AssemblyKeyFile("")]为:[assembly:AssemblyKeyFile(@"/key /xxxx.snk")]

这样就完成创建。

2 在 Visual Studio 2005 中,通过 C#、Visual Basic 和 Visual J# 集成开发环境 (IDEs) 可以生成密钥对,并且无需使用 Sn.exe 创建密钥对即可对程序集进行签名。以上 IDE 在“项目设计器”中具有“签名”选项卡。生成文件pfx与snk文件一样,都可以用来给程序集加上强名称,但是pfx是在加的过程中,需要设置密码的。如果想创建SNK文件则不选“使用密码保护密钥文件”,这样会生成一个扩展名为snk的文件。


=============================================

 

snk文件在.net里面被用作存放密钥或密钥对的存储文件,生成密钥对snk文件可以用.net中的sn.exe命令,如“sn   -k   keyPair.snk”。  
   
snk本身只是用来存放非对称密钥的,但在各个需要用到加密、签名的地方都可以使用:  
用snk文件生成强命名程序集,这样一个assembly才可以被赋予full-trust属性,也可以被添加到GAC中。在VS.NET中生成 strong-named   assembly,只需要在AssemblyInfo.cs里面添加一下代码并编译即可:  
[assembly:   AssemblyDelaySign(false)]  
[assembly:   AssemblyKeyFile("..//..//keyPair.snk")]  
[assembly:   AssemblyKeyName("")]  

强命名程序集的缘由: 目前Windows中出现的DLL Hell问题(两个不同的公司可能开发处具有相同名称的程序集,如果将相同名称的程序 集放置到同一个目录下,则会出现程序集覆盖现象,最后安装的程序集会覆盖前面的程序集,从而可能导致应用序不能正常运行)。由此看来,仅靠名称来区分程序 集是不足够的。CLR采取了强命名程序集的方式来唯一的表示程序集。强命名程序集包含四个标识:名称,版本号,语言文化标识和一个共有/私有密钥对。两种 程序集/两种部署方式:.Net支持两种程序集:弱命名程序集和强命名程序集(注:.Net框架中没有弱命名程序集,只是为了和强命名程序集相对应而 已)。弱命名程序集和强命名程序集在结构上是相同的。他们都采用PE文件格式,包含PE表头,CLR表头,元数据和清单表。区别在于:强命名程序集拥有一 个发布者的公钥/私钥签名对,他们用于唯一的标识程序集的发布者。通过公钥/私钥对,我们可以对程序集进行唯一的标识,安全策略和版本策略。

 

 

AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,
using System.Reflection;
using System;
using System.Runtime.ConstrainedExecution;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

//是否符合公共语言规范(CLS)
[assembly: CLSCompliant(true) ]
//控制程序集中所有类型对COM的可访问性
[assembly: ComVisible(false)]
//代码的作者和这些代码的的开发人员之间的可靠协定
[assembly: ReliabilityContract(Consistency.WillNotCorruptState,Cer.MayFail)]

// 有关程序集的常规信息通过下列属性集
// 控制。更改这些属性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("TestPetShop.SQLServerDAL")]
[assembly: AssemblyDescription("T测试PetShop4.0")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("CCP")]
[assembly: AssemblyProduct("TestPetShop.SQLServerDAL")]
[assembly: AssemblyCopyright("版权所有 (C) CCP 2007")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 属性设置为 true。
[assembly: ComVisible(false)]

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("dc8b813c-f361-476f-8cf1-8fab3d57ced7")]

// 程序集的版本信息由下面四个值组成:
//
//      主版本
//      次版本
//      内部版本号
//      修订号
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


http://www.niftyadmin.cn/n/1221531.html

相关文章

服务器管理器损坏求怎样修复

MMC无法创建管理单元。此管理单元可能没有正确安装。 名称:服务器管理器 CLSID:FX:{18ea3f92-d6aa-41d9-a205-2023400c8fbb} 貌似是由于.Net Framework出现故障。以下是网络上查找到的方法,希望对你有用:方案一:把系统升级安装的.…

数据库连接池配置

今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,希望对大家有所帮助:(已Mysql数据库为例) 一,Tomcat配置数据源: 方式一:在WebRoot下面建文…

生成自己定义的.pfx数字证书

生成自己定义的.pfx数字证书 备忘: rem 使用vs2005自动创建的.pfx数字证书默认有效期只有一年,并且“颁发者”、“颁发给”均为当前机器名和当前登陆用户名的组合,其实我们完全可以创建更友好的.pfx数字证书。 rem 打开Microsoft .NET Fr…

从零开始安装Hadoop视频教程

从零开始安装Hadoop视频教程 Hadoop 是一个能够对大量数据进行分布式处理的软件框架,用这种技术使得普通的PC服务器甚至一些近过时的服务器也能够发挥余热,组成大型集群系统,由于它的可伸缩性能够处理PB级的数据,更加适用于大数据…

java配置数据库连接池的方法步骤

先来了解下什么是数据库连接池 数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接&…

教你如果保证WebService的通讯安全

Web Service现在是很通用的技术,在Web Service我们需要验证用户是否有使用此Web Service的权限,并且要保证在通讯过程中的数据安全,防止数据在传输过程中被网络窃听。 首先是如何保证Web Service被授权使用,在这里我说的是通过Soa…

WPF+SQL Server 2008 TaskVision Demo小结

最近在Academy做了一个练习TaskVision,用WPFSQL Server 2008完成。主要的功能是,实现一个任务分配管理。具体如下: 系统登录,登录完成后,在MainWindow中用DataGrid显示任务的信息,可根据指定条件进行过滤&a…

SSH——Hibernate初学者之旅(一)

一、是什么 1、概念 Hibernate,翻译过来是冬眠的意思,冬眠其实就是维持一种平衡稳定的状态,也就是持久化。 持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存…