强命名可以使assembly具有唯一性(即使名字相同),使程序加载的assembly是可以信赖的程序集,但是强命名只能应用于.net framework 托管代码,所以微软有另外一个Authenticode 签名,它可以应用于托管代码和非托管代码。
强命名有两点需要注意
1. 如果assembly 需要安装进GAC,那必须要做强命名。
2. 如果assembly 将被强命名的assembly 引用,也必须做强命名。
混淆可以更好的保护代码的安全性,保护托管代码,防止被反编译。
这两个之间的具体使用可以参照转载。
对于Strong Name来说,如果自己开发的Project 需要进行Strong name, 那么编译器会自动对Project 应用的Assembly进行Strong name 检查,检查引用的assembly是否进行了强命名,如果你要开发一个assembly 给其他公司使用,那么我们会遇到下面的问题:
你开发的assembly被引用之后,有bug, 但是自己又无法重现,需要利用对方的程序才能重现,这样我们可能需要安装对方的程序(IP原因,对方不可能给你源代码或者没有经过混淆的代码),然后编译自己的assembly替换安装的程序中的assembly,进行调试。如果他们在Release的时候对你的assembly进行了strong name, 你替换assembly之后并不能进行调试,因为对方的程序会检测strong name, 这时候我们需要怎样处理呢?
Step1: 找到对方给你assembly签名时的public key, 运行下面命令后就会得到assembly.dll的public key
sn -T assembly.dll
Step2: 运行下面命令去 skip strong name 的validation, 这样所有这个public key的assembly都不会检测这个strong name.
sn - Vr *,key
实际上该命令是在注册表里写了键值,比如
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\*,55624f8ac7c20aa6]
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\*,55624f8ac7c20aa6]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\*,bc24dc22e8ee9a7e]
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\*,bc24dc22e8ee9a7e]
如果想查看这个dll/exe是否已经被Strong Named, 可以利用下面命令
C:\> sn -vf C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll
如果运行结果是:
Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30128.1
Copyright (c) Microsoft Corporation. All rights reserved.
Assembly 'C:\...\System.Data.dll'is valid
那就说明已经被strong named, 否则就是没有被strong named 或者只有public key, 以后再signed.
那么怎样对第三方的Assembly 进行strong name的操作呢?
如果你需要引用第三方的binaries,但是第三方的binaries还没有进行strong name,那么我们可以要求对方做,如果对方不做,那么我们需要自己进行strong name,步骤如下:
1。利用SN工具产生k文件,
sn -k mykey.snk
2。将所有没有strong name的binaries进行DASM,
ildasm binaryname.dll /output=binaryname.il
3。用文本工具(例如NotePad++)打开每个binaryname.il查看每个dll reference的其他dll是否签名,如果没有签名,那么需要把mykey.snk(自己产生的k文件)中的public key填到对应的位置,比如:
.assembly extern binaryname
{
.publickeytoken = (BE CA 05 5E 5B 7D 2D C8 ) // 如果你产生的snk文件的public key token是beca055e5b7d2dc8
.ver 2:0:0:0
}
4。利用ILASM 去签名并产生新的dll, 注意:如果第二步中如果除了il还有res文件的话,在合成的时候需要加上这个res文件。
ILASM.exe binaryname.il /resource=binaryname.res /DLL /output=binaryname.dll /key=mykey.snk
经过上述4个步骤就可以对第三方的dll进行签名。