.NET基础 (03)生成、部署和管理

生成、部署和管理
1 如何生成强签名的程序集
2 如何把程序集放入GAC中
3 延迟签名及其作用
4 程序集的版本分哪几部分

 

1 如何生成强签名的程序集
在生成程序集时,CLR提供了两种可选类型:
强签名程序集。
弱签名程序集。

强签名程序集是一个带有公钥和数字签名的程序集,每个强签名都可以由四个元素来唯一标识,它们分别是:文件名、版本号、语言文化和公钥。这些信息都被包含在程序集的清单之中。相对于强签名程序集,弱签名程序集拥有完全一样的元数据、CLR文件头和程序集清单,唯一不同的是弱签名程序集没有公钥,也不进行数字签名。弱签名程序集不能被放入全局程序集缓存(GAC)中,只能进行私有部署。

这里简单介绍一下加密的基本概念。当我们在处理私密信息的时候,就需要用到加密技术。常用的加密技术有对称加密技术、非对称加密技术和不可逆加密技术。.NET的公钥私钥机制属于非对称加密技术。非对称加密的基本概念是加密方用公钥对信息加密,而解密方需要使用公钥和与其配对的私钥对已加密信息进行解密。非对称加密的特点在于公钥可以公开,加密算法公开,而唯一控制解密的关键就在于私钥,所以在非对称加密中,公钥往往随加密信息一起发送到接收方,而接收方通过公钥来寻找与其配对的私钥并且进行解密。现在常用的非对称算法有RSA算法和DSA算法。

回到.NET的加密机制中,当生成一个强签名程序时,其公钥将被添加到程序清单之中。同时,在程序集被发布(Publish)时,也会生成一个数字签名,数字签名包含了程序集清单的散列值,而程序集清单又包含了该程序集中所有模块的散列值,在这种情况下,除非拥有程序集的公钥和私钥,否则将无法对程序集做任何改动。可见在强签名程序集中,公钥和数字签名一起实现了对程序集的保护。

下图展示了一个强签名程序集的内部结构,以及引用这个程序集的其他程序集的结构。程序集2引用了程序集1中的引用,所以在程序集2的CLR头中,保留了程序集1的公钥标记。



  注意:由于公钥过长,程序集引用可以使用公钥标记来代替公钥。公钥标记是指公钥的一个散列值,长为8个字节。

了解了公钥的基本原理之后,现在笔者以C#的编译器CSC.exe为例,来说明如何生成一个强命名的程序集。首先,需要为新的强命名程序集准备一对唯一的公钥/私钥。.NET Framework提供了一个很实用的工具:sn.exe。
打开一个Visual Studio 2010的命令台,输入下面这条命令:
sn –k C:/MyPublicPrivateKey.snk

sn.exe就会为我们在C盘根目录下生成一个MuPublicPrivateKey.snk文件。这个文件把公钥和私钥拼接在了一起,大小为596字节,其中前160字节属于公钥,而后436字节属于私钥。用户可以控制sn.exe的输入参数来仅仅得到公钥或者实现其他功能。

准备好了公钥/私钥对,就可以生成一个强命名程序集了。打开一个Visual Studio 2010自带的命令台并且进入xxx.cs所在的目录,输入以下命令:
csc.exe /t:library xxx.cs /keyfile:C:\MyPublicPrivateKey.snk

一个名为xxx的强命名程序集就被生成了,读者可以尝试自己编写一个引用该强命名程序集的程序集,并且尝试用一个弱命名程序集来代替它。当然,这是没办法实现的,公钥标记和数字签名将很好地保证程序集不能被随意篡改。

生成强签名的程序集需要有公钥/私钥对。在得到了公钥/私钥对后,就可以控制编译器的输入参数来得到一个强签名的程序集。对于C#的编译器CSC.exe来说,可以用/keyfile参数来制定使用那个公钥/私钥文件。


2 如何把程序集放入GAC中

所谓的GAC,就是全局程序集缓存(Global Assembly Cache)。被放入GAC的程序集,无论在何处被其他程序集引用,都可以保证自己能够被CLR找到并且加载。简单来说,GAC是一个有规范的目录结构。如果主机使用的是Windows操作系统,并且操作系统被安装在c:\windows下,那么GAC会被安装在c:\windows\assembly\下。

这种显示方式和一般的文件夹显示方式有很大区别。实际上,.NET Framework附带了一个全局程序集缓存的查看器assembly viewer,上图就是这个查看器的显示功能,它很清楚地列出了唯一标识一个程序集的4个元素:名称、版本、文化和公钥标记,同时,它也列出了另外一个影响程序集在GAC中目录结构的元素:处理器体系结构。读者可以通过关闭查看器功能来亲眼看一看GAC目录的真正面目。具体做法是在注册表HKEY_LOCAL_ MACHINE\Software\Microsoft\Fusion下建立一个名为DisableCacheViewer的DWORD值,并且将该值设为0。读者将会发现GAC是一个多层的目录结构,其结构符合一定的规范。
注意 除非需要学习GAC目录结构,否则在任何时候都不应该手动地去修改GAC目录,任何对GAC目录的操作都应该通过工具实现。

在一般情况下,GAC具有如下优点:

  • 程序集被多处引用时,可有效减少内存成本。
  • 通过发布者策略可以有效地发布程序集的最新版本。
  • 同一程序集的多个版本可以共存,并且可以通过配置进行切换。

是否所有的程序集都可以被放入GAC中呢,答案是否定的。只有带有公钥的强签名程序集才能被部署到GAC中去,在程序集被放入GAC时,.NET将检查程序集的CLR头和加密值,保证程序集未被篡改。把程序集放入GAC中可以手动地部署,也可以通过工具进行部署。最简单的方法就是通过前面介绍的assembly viewer直接把程序集拖入到assembly viewer显示的GAC目录下。

  注意:这里提到的拖放,实际上还是使用了assembly viewer的功能,而不同于直接把程序集复制到GAC文件夹下。再次强调,读者不应该手动地去修改破坏GAC目录结构。

.NET Framework还提供了一个工具来有效地管理GAC:GACUTIL.exe。笔者生成了一个强签名的程序集:Compile.dll。现在,尝试将其放入GAC中:
Gacutil –i Compile.dll
进入assembly viewer,读者将会发现刚刚加入的这个新程序集:Compile.dll,0.0.0.0。

GAC是一个具有特定目录结构的文件夹,所有强签名的程序集都可以被放入GAC中。可以通过.NET Framework自带的assembly viewer来简单地拖动添加一个程序集到GAC中,也可以利用诸如gacutil.exe等工具使用命令行来添加。总之,任何方法归根结底,都是根据GAC的规范和程序集本身的特性,在GAC目录下建立相应的子目录结构。


3 延迟签名及其作用

当生成一个强签名程序集时,在CLR头部中会加入公钥和数字签名,公钥和数字签名能够保护程序集不被随意篡改。但是,有经验的.NET程序员或者项目经理会有这样的切身经历,带有防篡改功能的程序集在开发和测试阶段会变得极其不方便。为了使用和修改该程序集,项目组不得不把非常重要的私钥分发出去,而这将会给项目的保密性带来极大的威胁。

所以,在项目的开发和测试阶段,延迟签名技术会被经常使用。顾名思义,延迟签名的基本概念就是把私钥加密延迟到项目真正发布时再进行。而在开发和测试阶段,程序员将只用一个公钥来生成强签名程序集。这样程序集的CLR头中只有公钥而没有数字签名,数字签名的空间将会被保留,而且所有的文件也不经过加密处理。

在CLR头中,数字签名的空间被保留了下来,并且没有对文件进行HASH处理。而在其他方面,延迟签名不会产生任何影响。说到这里,读者可能会有这样的疑问,延迟签名的程序集能否被放入到GAC中呢?回顾一下在上一节中介绍的,GAC对程序集的要求为该程序集是带有公钥的强签名程序集。延迟签名的程序集带有一个公钥,所以原则上是可以被放入GAC的,但由于GAC会对程序集进行加密验证,延迟签名的程序集缺乏私钥而没有经历任何HASH处理,所以延迟签名的程序集在被放入GAC之前,需要通知.NET不要对该程序集进行加密验证。

延迟签名就是指把对强签名程序集的私钥加密和数字签名延迟到实际发布时进行。延迟签名提高了开发测试阶段的效率,也方便了机构和项目组管理自己的私钥。


4 程序集的版本分哪几部分

有四个元素可以唯一标识一个强签名程序集,分别是名字、版本号、文化和公钥。程序集的版本号通常由四个部分组成,它们是:

  • 主版本号(Major Version)
  • 次版本号(Minor Version)
  • 内部版本号(Build Version)
  • 修订号(Revision Version)

默认地,版本号越大代表系统越新。一般主版本号和次版本号的定义比较明确,当系统经历一个比较大的升级,主版本号会有改动,而在一个主版本中,小功能的发布则会通过次版本号进行发布。关于内部版本号和修订号,理解的分歧会更大一点。在一般情况下,一个内部版本号代表系统内部的一次集成周期,而一个修订号,则代表集成周期中的一次编译。

例如某个目前版本号为12.2的系统组织内部,决定在新版本12.3发布前进行6个集成周期,每个集成周期历时一周,而编译系统则被设置成每天午夜编译一次。这样在通常情况下,这个系统将针对6个集成周期形成6个内部版本号,从12.3.1到12.3.6。而对于每个内部版本将会经历7次编译,则系统会拥有7个修订号。例如第二版本,将会拥有这样7个版本号:12.3.2.1到12.3.2.7。

注意:版本号的划分并没有明确的规范。但组件发布者应该按照常用定义来确定产品的版本号,怪异的版本号划分将会误导组件使用者。

 

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

转载于:https://www.cnblogs.com/jesselzj/p/4782493.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net 识别一维码_天若OCR文字识别 v5.0 原创好用的OCR及翻译小工具

一款非常好用的OCR及翻译小工具,集合百度、腾讯、有道、搜狗,调用了各大网站的ocr接口,免费不限次数(有道免费接口有ip限制仅供娱乐)。1、对于搜狗的接口调用的还是http://ocr.shouji.sogou.com/v2/ocr/json,这个接口识别效果很好…

html中div中加颜色,css怎样给div加边框颜色

css怎样给div加边框颜色1、css为div四个边分别添加边框border-color:#000(设置4边边框颜色为黑色)border-color:颜色值,即可设置对象边框颜色border-left-color:#000 设置左边框颜色为黑色border-right-color:#000 设置右边框颜色为黑色border-top-color:#000 设置上…

Microsoft Dynamics CRM 前瑞开发

做CRM开发最大的感受就是其前瑞开发过程中,调试起来比较麻烦,需要做一些断点还要配制一些浏览器设置,对新手来说比较困难。还有就是对REST调试,经常为了调试一个正确的结果而花费大量的时间。现在推荐一个REST 工具来调试CRM的前瑞…

割线法求解过程_求解稀疏优化问题2——临近点方法+半光滑牛顿法

这篇文章是我之前一篇文章的兄弟篇,没看过的可以看下面这个。邓康康:求解稀疏优化问题——半光滑牛顿方法​zhuanlan.zhihu.com我们考虑的问题仍然是如下的一般问题:其中 ,并且 特别大;表示一个凸可微函数,例如 表示一…

html 树形图可拖拽,HTML5拖拽API实现vue树形拖拽组件

因业务场景需要一个可拖拽修改节点位置的树形组件,因此动手撸了一个,乘此机会摸了一把html5原生拖拽。近期有时间将核心部分代码抽出,简单说下实现方式。1.树形结构-组件递归使用树形结构非常简单,tree组件作为父组件,…

jmeter如何定位网络延时_JMeter用户定义变量和properties变量高级使用

Jmeter有个配置元素叫做用户自定义变量(英文名称是UserDefinedVariables)而我们提到的vars即是Variables的简写。 之前我们也说到过Jmeter的脚本中(jsr223sampler或者beanshell编写的脚本)使用varsput和varsget的操作(varsget和put的操作仅在threadgroup测试组线程中执行&#…

jQuery中的几个模块总结

Query插件,以备并希望在前端方面有所长进。请批评指正。 一,类型判断全解 JQuery判断类型扩展方法:$.type() 1 /*type: function( obj ) { 2 if ( obj null ) { 3 return obj ""; 4 } …

python实现连续数列相加_技术 | Python经典面试题解析实现斐波那契数列

黑马程序员微信号:heiniu526传智播客旗下互联网资讯,学习资源免费分享平台大家在面试过程中经常会考到斐波那契数列,斐波那契数列(Fibonacci)最早由印度数学家Gopala提出,而第一个真正研究斐波那契数列的是意大利数学家 Leonardo …

广西2021高考成绩位次查询,2020年广西高考一分一段表及高考位次成绩排名查询(理科+文科)...

一、2020年广西高考一分一段表查询排名方法广西招办(考试院)会公布的省市高考每一分分数的考生数额统计表就是我们所说的——高考“一分一段表”,其显示出每一分的分数值全省考生有多少名,就可以让考生估算出自己的排名位次。2020年广西高考一分一段表排…

台式计算机单核与双核,什么是单核cpu、双核cpu 单核cpu和双核cpu的区别是什么...

在买电脑的时候,我们经常会发愁,究竟是买单核cpu好,还是买双核cpu比较好,尤其是面对售货员把单核cpu电脑和双核cpu电脑都可以夸的天花乱坠的时候,我们更糊涂了,究竟买哪种好呢?针对这种情况,小…

美国计算机生物学要求,美国大学CS专业分支生物信息学和计算生物学专业 Bioinformatics and Computational Biology介绍...

美国留学申请美国大学计算机专业(CS)的学生非常多。美国大学CS专业的研究分支也非常 多,不同分支对学生的要求也会不同,因此,学生们要根据自己的条件选择适合自己的研究方向。下面主要为大家介绍的是美国大学CS专业分支生物信息学和计算生物学…

Spark入门实战系列--8.Spark MLlib(上)--机器学习及SparkMLlib简介

【注】该系列文章以及使用到安装包/测试数据 可以在《倾情大奉送--Spark入门实战系列》获取 1、机器学习概念 1.1 机器学习的定义 在维基百科上对机器学习提出以下几种定义: l“机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能&#xff0c…

计算机基础cpu知识,CPU基础知识: DIY装机小白必看的CPU知识扫盲

CPU也就是中央处理器,全拼为Central Processing Unit,在计算机中可以比喻成人的大脑。它是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。下面华强电子网的小编分享一…

mvc html validator,ASP.NET MVC实现Validation验证器扩展

今天介绍在ASP.NET MVC实现Validation验证器扩展,通过使用Controller验证并不是最好的方法:验证过于分散,容易造成重复代码,不利于维护与扩展,因此本节将使用MVC默认绑定器(DefaultModelBinder)中包含了验证架构,并实现Validation验证器扩展&…

自定义列表视图

通过继承BaseAdapter写一个子类,可以创建自定义列表视图: public class MyListAdapter extends BaseAdapter { private LayoutInflater mInflater;//声明一个LayoutInflater类变量 private Context mContext;//声明一个Context类变量 priva…

springmvc请求返回一个字符_SpringMVC系列之Web利器SpringMVC

课程简介:课程目标:了解SpringMVC和Spring的关系,能够使用SpringMVC框架开发自己的Web应用。整合Spring , SpringMVC , MyBatis搭建项目开发环境,理解三层架构和MVC模式适用人群:适合对Java基础知识应用自如&#xff0…

一次完整较为渗透过程

步骤一: 利用阿D浏览器通过https://s.bt.gg 注入关键字扫描发现注入点: http://www.rqyl.gov.cn/*****.php?ID153 用啊D跑不出账号密码 步骤二: 手工注入http://www.rqyl.gov.cn/*****.php?ID153 and 11 、and12出错 猜字段ht…

计算机网络线路争用,计算机网络系统集成复习要点

计算机网络系统集成复习要点计算机网络系统集成复习要点1.在信息领域,对于系统集成一般分为软件集成、硬件集成和网络系统集成。2.按网络覆盖范围的大小,将计算机网络分为局域网(LAN)、城域网(MAN)、广域网(WAN)和互联网。3. 计算机网络拓扑结构是指一个…

v380pro设备连接失败_天猫精灵可以连接台式电脑使用吗?需要什么东西? 安装操作是哪几个步骤? 最好有图片解说!...

使用语音将天猫精灵调到【蓝牙配对】;打开电脑的蓝牙适配界面,让电脑找到天猫精灵,稍等片刻,点击【使用远程装置的扬声器聆听来自此PC的音频】后的连接;最后调整音量即可。以下是详细介绍:1、对天猫精灵说【…

IDE-Ecplise-代码注释 模版 编码规范 配色

说明: 代码注释主要用于方便代码后期维护,编码规范,增加代码阅读性和维护性。因网上看到的很多博客中片段局多,故整理后重写一篇,方便交流学习。 先看下加过注释模版后的效果。如上图所示,创建类&#xff0…