.NET中的强名

深入了解.NET中的强命名与序列化技术 本文还有配套的精品资源,点击获取 简介:在.NET框架中,强命名用于为程序集提供唯一标识以防止篡改,涉及生成密钥对、编译时签名以及运行时验证。而序列化则是将对象状态转换为可存储或传输格式的过程,包括.NET内置序列化和第三方库等方法。强命名和序列化技术对于保证.NET应用的完整性和对象状态的正确传输至关重要,本课程将详细探讨这些概念及其应用。 1. .NET强命名... 阅读详情

.NET中的强名

如果你使用.NET作为开发工具很长时间了,你肯定回会碰到“强名”(strong name)这个概念。这个概念并不意味你的组件命名方式必须类似于MyCompany.Gorilla.Biceps的方式。强名的力量体现在对组件的保护方面,.NET Framework使用强名来标识组件和保护组件使其免遭破坏。在这篇文章中我将说明如何建立强名,以及在.NET中使用强名的技巧。

1. 散列和签名

为了了解强名的工作原理,你必须首先理解密码学方面的两个概念:散列(hashing)和数字签名(digital signatures)。散列是用来为明文(plaintext)信息创建一个唯一的压缩的值。这里的“信息”是一个很广泛的概念,对于组件来说,信息就是它本身。如图1所示,信息作为散列作为散列算法的输入而被处理,对于强名情况,采用SHA1算法。

图1  计算散列

散列是不可逆的,一旦计算出来,是不可能解密的。但是,散列在比较值方面是非常有用的。如果两个组件生成同样的散列值,你可以认为这两个组件是相同的。相反,通过散列计算出来的值和以前计算的值不一样,说明组件中某个地方被修改了。

因此通过散列值你就可以知道,组件是否被修改或破坏。然而你怎样通过散列值来防止别人对你的组件的修改呢?下面就是我要讲的“数字签名”。

虽然数字签名的具体数学原理很复杂,但是概念很简单。一个数字签名依赖于两个相关的数字:公共秘匙(public key)和私有密匙(private key)。如图2所示,当数据通过公共秘匙加密后,它只能通过私有密匙来解密,反之亦然。

图2  使用密匙对

2.  组件的强名

  在.NET中共同使用散列和数字签名就能够保护你的组件免遭破坏。其原理如图3所示,首先从组件产生一个散列值,然后这个散列值通过你的私有密匙被加密,然后这个散列值和公共密匙被一起防止在组件中。

图3  在组件中添加强名

在运行的时候,公共语言运行时(CLR)通过比较散列值验证组件。首先公共的密匙用来解密散列,从当前的组件中计算出一个新的散列。如果它和原来的值吻合,那就通过了验证,如图4所示。

图4  检查组件中的强名

那么如果一个组件在签名之后被破坏将会发生什么样的情况呢?显然,在运行时从组件中计算出来的散列值将不会与存储在组件中通过私有密匙加密的散列值吻合,这样公共语言运行时将拒绝加载该组件。

注意强名只是保证了组件的完整性,而并非它的安全性,没有什么办法来防止某个人创建一个恶意的组件,并通过强名来给它签名。你可以通过强名来验证某个组件在签名后是否被破坏。基于你对于信息的选择。这一切将由你来决定是否相信从某个地方来的组件和代码信息。

3.强名的其它信息

除了从组件内容求出来的散列,强名还包含一下三个方面的信息。

l         组件简单文本名称

l         组件版本号

l         组件的语言文化代码

所有的这些信息,将为每个组件提供唯一的标识。有了这些信息,公共语言运行时可以决定一个组件是否被另一个组件通过引用的方式调用。当你从一个组件引用另一个组件,该组件将存储被调用组件的公共密匙。在运行的时候,公共语言运行时将通过这些来判断该组件是否来自正确的供应商。另外强名中的其它信息用来判断组件是否符合引用的绑定策略(binding policy)的要求。

4.使用强名的技巧

  .NET Framwork SDK和 Visual Studio.NET为指定强名提供了很多的工具,这是很有意义的,因为通过Visual Studio.NET来创建组件具有更多的选择。在你签名之前你必须创建一对密匙(公共密匙和私有密匙),通常密匙对放置在以.snk结尾的文件中。可以通过强名工具sn.exe来实现。

        sn -k MyKeyFile.snk

   如果你使用命令行编译器(vbc.exe或者csc.exe),你就可以为组件连接器al.exe,指定密匙对。如下面的命令行所示,你可以将存储在MyKeyFile.snk中的密匙对作为MyFile.dll的签名。

al /out:MyFile.dll MyFile.netmodule /keyfile:MyKeyFile.snk

如果你使用Visual Studio .NET,你仍然可以通过命令行的方式产生你的密匙对。有了密匙对之后你就可以通过设定在组件信息文件(AssemblyInfo.vb 或者semblyInfo.cs)的【AssemblyKeyFile】属性来把它包含到组件中。例如C#工程,你可以通过该属性包含密匙文件而生成一个签名组件。

[assembly: AssemblyKeyFile("..//..//MyKeyFile.snk")]

   从被编译的组件到密匙文件,【AssemblyKeyFile】属性中的文件名必须包含完整的相对路径。

5.通过延迟签名加密

保护你的私有密匙是非常重要的,如果某个恶意的人取得了你的密匙,他生成的组件将和你签过名的组件一样。因此,应当把你的密匙设于高度的保密状态,公司里面可能就只有几个人知道。这样以来,又怎么给你的组件签名呢?如果就只有你一个人知道密匙,这样会很繁琐,因为你必须为公司中每个开发者开发出来的每个组件签名。

很幸运的是.NET为这个问题提供了一个很好的方法:延迟签名。通过延迟签名,你可以在只知道公共密匙的情况下创建和测试组件。只有在组件实际分发给用户时才将私有密钥匙包含到组件。下面是使用延迟签名过程的一些技巧总结:

1.         从公共/私有密钥匙对中提取公共密匙。为了提取公共密匙,也就是存储公共/私有密匙对,你可以使用强名工具,命令行如下:

sn.exe -p MyKeyFile.snk MyPublicKeyFile.snk

2.         将包含公共密匙的文件分发给公司所有的开发者,同时将包含公共/私有密钥匙对的文件安全存放。

3.         在组件信息文件中包含公共密匙的文件,并注明延迟签名。

[assembly: AssemblyDelaySign(true)] 
[assembly: AssemblyKeyFile("..//..//MyPublicKeyFile.snk")]

如果你使用组件连接工具,而非Visual Studio .NET,你可以使用/delaysign命令行来表明延迟签名。

4.         如果你把组件保存在全局程序集缓存(GAC)中,应关闭对组件的验证,因为GAC默认验证每个组件的强名。如果组件没有采用私有密钥匙来签名,这个验证将会失败。因此,出于开发和测试的目的你可以输入如下的命名行:

            sn.exe -Vr MyFile.dll

5.         这样,你就可以在开发和测试的时候很自由的使用组件

6.         当部署一个延迟签名的组件的时候,你必须通过私有密匙来给它签名。

sn.exe -R MyFile.dll MyKeyFile.snk

7.         最后,你必须通知GAC重新开启对组件的验证。命名行如下:

sn.exe -Vu MyFile.dll

6.可信任计算(TrsutWorthy Computing)

你肯定听说过微软的“可信任计算”措施,它包含了有关微软产品的很多安全方面的措施。微软正慢慢的而且必然的朝着一个方向发展,那就是他们将使他们所有的软件产品是默认安全的。如果你知道你在做什么,你就可以降低软件(如Windows Server 2003)的安全级别。虽然降低了安全级别,但太可能使你受到突发事件的攻击。

当你给你的组件赋予强名,你在做就是“可信任计算”。通过强名来分发你的组件,会使得组件不太可能成为木马和其他攻击计算机黑客程序的载体。.NET Framework和Visual Studio .NET提供的工具保证了你分发组件的完整性。因此我强烈建议你使用这些工具,通过这些工具来使得计算世界变得更安全一点。

.Net强命名移除工具 .net平台的程序集强命名移除工具,已测试可以成功去除强签名,文件中包含示例截图 立即下载

相关推荐

用MFRC522+STM32打造智能门禁:从硬件选型到云端控制全流程

本文详细介绍了基于STM32微控制器和MFRC522射频模块构建智能门禁系统的完整流程。从硬件选型、电路设计、底层驱动开发,到系统软件架构与状态机设计,并最终实现通过ESP8266模块接入云端平台(如OneNET)进行远程控制和数据可视化。项目深入探讨了MFRC522的SPI通信、卡片操作流程、天线调试以及云端MQTT集成等关键技术,为嵌入式开发者提供了一个从本地感知到云端管控的物联网项目实战参考。

raspberrypi5的博客 741

c# 强命名的作用

我在PetShop4程序中加入了一个业务外观层,然后在业务逻辑层(PetShop.BLL)引用这个程序集,点“生成”,出现以下 的错误:“程序集生成失败 -- 引用的程序集没有强名称”,原因是PetShop.BLL是强命名程序集,强命名程序集不能用普通 程序集造成的。     那么什么叫强命名程序集呢?我们知道,以前在Windows下开发程序时常会遭遇著名的“DLL Hell”问题,即动态链...

weixin_34241036的博客 293

树莓派4B学习笔记一

树莓派4b烧录Ubuntu20.04&&配置Ubuntu桌面

m0_55202222的博客 3634

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

生成、部署和管理1 如何生成强签名的程序集2 如何把程序集放入GAC中3 延迟签名及其作用4 程序集的版本分哪几部分 1 如何生成强签名的程序集在生成程序集时,CLR提供了两种可选类型:强签名程序集。弱签名程序集。 强签名程序集是一个带有公钥和数字签名的程序集,每个强签名都可以由四个元素来唯一标识,它们分别是:文件名、版本号、语言文化和公钥。这些信息都被包含在程序集的清单之中。相对于强签...

weixin_30563319的博客 133

openwrt编译及第一个安装包教程

Date: 2017.03.14 Made:SuperDeverloper Email: na1206@live.com Target: For mt7688 based board说明:本人在学习过程中走了不少弯路,希望本文档能为后来者提供便利。欢迎复制和使用本文档。本文档记录了搭建openwrt编译环境以及快速创建ipk包(openwrt上的安装程序)。本文档在实际应用中做过几次修改,以帮

SuperDevloper的博客 1万+

ue4 classuobject没有成员beginplay_【教程】UE4 C++实现简单的AI及遇到的坑

后续文章更新移步→微信公众号“虚幻社区”(mantra-xhsq),您的支持是我创作的动力。我们这篇文章的宗旨是用代码实现简单的AI,有多简单,只是搭建一个具有PawnSensing组件和回调的AI。重点也不是做一个AI,而是了解一下C++代码如何搭建最基本的AI(关于蓝图如何创建请自行百度)。如果英语还不错的话,可以移步 参考链接,链接中的内容除了创建基本的PawnSensing组件还有关于行为...

weixin_39929918的博客 1126

关于.Net的强名称(Strong Name)

.Net中的强名称(Strong Name) <!-- @page { size: 21cm 29.7cm; margin: 2cm } @page:first { } /*custom styp*/ Body {font-family:幼圆; font-size:11pt; background-color: #CCE

Anor的专栏 3571

Python自动化生成HyperMesh Tcl命令流:从几何建模到有限元分析

本文详细介绍了如何利用Python自动化生成HyperMesh的Tcl命令流,实现从几何建模到有限元分析的全流程二次开发。通过封装常用操作函数,工程师可以高效完成参数化建模、自动网格划分及求解器文件输出,显著提升CAE前处理效率与标准化水平。

weixin_29041767的博客 423

.net 强名称签名机制和防修改机制

签名机制 1. 用SN.exe 生成一个key文件, 这个key文件包括一个public key 和一个private key. 2. 用这个key文件签名assembly时, 编译器将用private key签名程序集, 并将public key嵌入manifest中 3. 编译器哈希manifest中所有的assembly内容, 并将此哈希值各自assembly的FileDef Ta...

weixin_30565327的博客 213

FAST-LIO论文公式解析

FAST-LIO论文公式解析

努力努力努力 670

Mac安装Claude Code的3种方式及5类报错解决方案

介绍在Mac上安装Claude Code的3种实测可行方式(官方dmg、Homebrew+ARM原生构建、Docker容器化),并针对Gatekeeper签名验证失败、Rosetta 2内存对齐崩溃、Python ABI兼容性冲突等5类高频报错提供根因分析与可复现解决方案,覆盖M1–M3及Intel

weixin_28728443的博客 361

NET中的强名

NET中的强名如果你使用.NET作为开发工具很长时间了,你肯定回会碰到“强名”(strong name)这个概念。这个概念并不意味你的组件命名方式必须类似于MyCompany.Gorilla.Biceps的方式。强名的力量体现在对组件的保护方面,.NET Framework使用强名来标识组件和保护组件使其免遭破坏。在这篇文章中我将说明如何建立强名,以及在.NET中使用强名的技巧。1. 散列和签名为

.NET技术专栏 1279

1.2 Spring AI V1.1.2版本 架构全景:模块拆解与设计哲学

Override// 检查请求的 Token 数量throw new TokenLimitExceededException("请求超出 Token 限制");@Override// 记录实际消耗的 Token@Override// 最先执行// 接口// 不同实现// 使用方无需改变定义抽象,保证可移植性提供 Fluent API,提升开发体验Advisor 机制提供扩展点,支持灵活定制模块化设计让你只引入需要的依赖自动配置。

小林夕程的博客 219

.net强名

  如果你使用.NET作为开发工具很长时间了,你肯定回会碰到“强名”(strong name)这个概念。这个概念并不意味你的组件命名方式必须类似于MyCompany.Gorilla.Biceps的方式。强名的力量体现在对组件的保护方面,.NET Framework使用强名来标识组件和保护组件使其免遭破坏。在这篇文章中我将说明如何建立强名,以及在.NET中使用强名的技巧。1.散列和签名为了了

深海狂鲨 894

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

.Net 强名浅析

.Net 强名浅析 2010-09-30 18:45 by 轩脉刃, ... 阅读, ... 评论, 收藏, 编辑 Assembly强名浅析 首先需要明白几个信息: 1. 什么是Assembly Qualified Name? Assembly Qualified Name 不等同于Assembly的文件名,也同时包含版...

轩脉刃的刀光剑影 90

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

NET强名

.vb 或者semblyInfo.cs)的【AssemblyKeyFile】属性来把它包含到组件中。例如C#工程,你可以通过该属性包含密匙文件而生成一个签名组件。[assembly: AssemblyKeyFile("..//..//MyKeyFile.snk")]   从被编译的组件到密匙文件,【AssemblyKeyFile】属性中的文件名必须包含完整的相对路径。5.通过延迟签名加密保护你的私

Simple Is True 711

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

.net强名2

.net强名 可以向程序集分配称为强名称的加密签名,它为程序集提供名称的唯一性并防止他人借用您的程序集名称(名称欺骗)。如果您正在部署一个将被同一台计算机上的多个应用程序共享的程序集,则该程序集必须有强名称。即使只在您的应用程序中使用该程序集,使用强名称也可确保加载该程序集的正确版本。简单的说     它是使用于装配件需要注册到全局缓冲时     标示装配件的唯一标识     这样,一方面

深海狂鲨 619

.net强名3

 一个程序集包括四个区分彼此的属性:l         文件名(不包括扩展)l         版本号l         文化标识l         公钥标识现在让我们来看看一个比较常见的强名称程序集:l         Name= MSCorLibl         Version=1.0.3300.0l         Culture=neutrall 

深海狂鲨 669

dotnet强名4

研究了一上午,才知道.net强名一点用都没有,强名之后 无非两个作用:区分程序集         避免程序集被恶意更改    与我们平时web应用程序几乎没有用处,不要说是因为我的程序不牛比。主要是在共享程序集中才使用.

深海狂鲨 547

.net 开发中的AssemblyInfo.cs文件的作用

<br />AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数请看以下具体说明: <br />//备注: <br />[assembly:AssemblyDescription("用最强的抢劫类写成!")] <br />//产品名称 <br />[assembly:AssemblyProduct("产品名称 ")] <br />//公司 <br />[assembly:AssemblyCompany("公司")]<br />//合法商标 <br />[assembly:

游戏全栈,技术合作 1014

.NET安全系列之六:强名程序集

<br />http://www.cnblogs.com/lsxqw2004/archive/2009/01/28/1381338.html<br /> <br />在.NET之前,Window操作系统使用一项名为Authenticode的技术来验 证可执行文件。与强名技术的类似的,它也是对程序集进行数字签名,不过两项技术主要针对的目标不同。Authenticode用于标识一个可执行文件的创 建人或组织。通过它我们可以执行一个程序而不用担心它是伪造的。而强名技术表人一个程序集,使相同名称但不同版本的程序

pp_zz的专栏 433
上一篇: VB.NET中的Option Explicit和Option Strict
savl
博客等级 码龄24年 1粉丝 2原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值