Globally Deployment Assembly全局部署程序集
(一)StrongName Assembly
Strongly Named Assembly是CLR唯一标识程序集的机制,包含4个特性:
·文件名(没有扩展名)
·版本号
·语言文化
·公有密钥标记
例如:MyTypes,Version=1.0.123.0,Culture=neutral,PublicKeyToken=1234567890123456
利用 SN.exe 产生一个公钥/私钥对
SN -k mycompany.keys
查看公钥
sn -p mycompany.keys mycompany.publickey
sn -tp mycompany.publickey
Microsoft (R) .NET Framework 强名称实用工具版本 1.1.4322.573 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
公钥为 0024000004800000940000000602000000240000525341310004000001000100830304ce5787ef d2355d71fa73739ea27581329409f9b2d4aaa38409a0aba5b77bfa34ffe425180b86ba432a4f21 52f9f6c2aceb005d57208f7b3d48bd569110e91d7cdbdf534f20ed822650311c69ddda11fb721e 128de231a6a0661aba1eb3e306acf2dc0777fc266612c4d7491118657cc741d99090a95bdfd969 0b885ac8
公钥标记为 91e5e7845907a9e6 |
创建StrongName Assembly(using System.Relfection):
[assembly:AssemblyKeyFile("mycompany.keys")]
StrongName Assembly的元数据信息:
Assembly ------------------------------------------------------- Token: 0x20000001 Name : Hello Public Key : 00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00 00 24 00 00 52 53 41 31 : 00 04 00 00 01 00 01 00 83 03 04 ce 57 87 ef d2 35 5d 71 fa 73 73 9e a2 : 75 81 32 94 09 f9 b2 d4 aa a3 84 09 a0 ab a5 b7 7b fa 34 ff e4 25 18 0b : 86 ba 43 2a 4f 21 52 f9 f6 c2 ac eb 00 5d 57 20 8f 7b 3d 48 bd 56 91 10 : e9 1d 7c db df 53 4f 20 ed 82 26 50 31 1c 69 dd da 11 fb 72 1e 12 8d e2 : 31 a6 a0 66 1a ba 1e b3 e3 06 ac f2 dc 07 77 fc 26 66 12 c4 d7 49 11 18 : 65 7c c7 41 d9 90 90 a9 5b df d9 69 0b 88 5a c8 Hash Algorithm : 0x00008004 Major Version: 0x00000000 Minor Version: 0x00000000 Build Number: 0x00000000 Revision Number: 0x00000000 Locale: <null> Flags : [SideBySideCompatible] [PublicKey] (00000001)
AssemblyRef #1 ------------------------------------------------------- Token: 0x23000001 Public Key or Token: b7 7a 5c 56 19 34 e0 89 Name: mscorlib Major Version: 0x00000001 Minor Version: 0x00000000 Build Number: 0x00001388 Revision Number: 0x00000000 Locale: <null> HashValue Blob: Flags: [none] (00000000) |
(二)GAC(Global Assembly Cache)
c:\windows\Assembly\GAC
使用工具GACUtil.exe来实现安装卸载:
安装一个StrongNameAssembly:
gacutil.exe /i myassembly.dll
卸载一个StrongNameAssembly:
gacutil.exe /u myassembly.dll
在DOS窗口下查看细节:
(三)引用StrongNameAssembly
我们发现安装DotNetFramwork的机器会有两份程序集文件,一份是在C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\zh-CHS中,另一份则是在GAC中。
目的是方便应用程序的引用和加载.
引用是指我们在编译程序的时候,如果需要引用别的程序集,则编译器会按照这样的目录查找:
(1)使用编译器的/reference指定的文件的完全路径,如果只是程序集名称,则继续寻找
(2)当前工作目录
(3)CLR所在目录(C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\zh-CHS)
(4)使用编译器的/lib指定的目录
(5)LIB环境变量指定的目录
加载是指应用程序运行的时候加载需要的程序集的路径(加载顺序在前面已经提到)
利用响应文件(.rsp)来设置编译器的命令开关:
例如,创建一个myproject.rsp文件:
/out:myproject.exe
/target:winexe
编译的时候使用这个文件
csc @myproject.rsp file1.cs file2.cs
那么就等于我们不用这个响应文件的命令行:
csc /out:myproject.exe /target:winexe file1.cs file2.cs
在C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322里面有个csc.rsp文件
# This file contains command-line options that the C# # command line compiler (CSC) will process as part # of every compilation, unless the "/noconfig" option # is specified.
# Reference the common Framework libraries /r:Accessibility.dll /r:Microsoft.Vsa.dll /r:System.Configuration.Install.dll /r:System.Data.dll /r:System.Design.dll /r:System.DirectoryServices.dll /r:System.dll /r:System.Drawing.Design.dll /r:System.Drawing.dll /r:System.EnterpriseServices.dll /r:System.Management.dll /r:System.Messaging.dll /r:System.Runtime.Remoting.dll /r:System.Runtime.Serialization.Formatters.Soap.dll /r:System.Security.dll /r:System.ServiceProcess.dll /r:System.Web.dll /r:System.Web.Mobile.dll /r:System.Web.RegularExpressions.dll /r:System.Web.Services.dll /r:System.Windows.Forms.Dll /r:System.XML.dll |
(四)StrongNameAssembly的防篡改特性
在安装StrongNameAssembly到GAC的时候,系统将会自动验证程序集是否被篡改,在从GAC加载的时候又一次以不同的方式验证,如果从别的非GAC目录加载,也会对程序集进行严密验证。
(五)延迟签名
为了防止私有密钥的泄漏,我们可以使用延迟签名技术(Delayed Singning).
(1)取得公有密钥的文件,并将下面两个特性加入到源代码:
[assembly:AssemlyKeyFile("MyCompanyPublicKey.keys")]
[assembly:AssemlyDelaySign(true)]
(2)生成Assembly的时候,执行下面的命令可以将Assembly安装到GAC中(一次操作即可)
SN.exe -Vr MyAssembly.dll
(3)打包部署应用程序时,取得公有/私有密钥对,执行命令:
SN.exe -R MyAssembly.dll MyCompanyKey.Keys
(4)执行下面的命令,恢复验证过程进行测试:
SN.exe -Vu MyAssembly.dll