posted at 2017.5.9 20:19 by 风信子
假如我有一个程序集HelloWorld.dll,如果我用我自己的私钥进行签名将程序集中的内容进行哈希处理,其他人如果不知道我的私钥的话,就不能篡改我的这个程序集进行某些恶意的行为。
但对于一些大型程序的开发,私钥一般是不公开的,当然,与它匹配的公钥是公开的,可以自由分发。那么如何确保开发人员在开发的过程中使用强命名程序集(如希望将其放到GAC中,因此必然得是强命名程序集)。延迟签名就是为此目的。
仍以HelloWorld.dll为例:
1)生成公钥/私钥对
sn -k Blog.snk
2)提取出公钥,而将私钥另外进行妥善保管
\Program Files\Microsoft Visual Studio 11.0>sn -p Blog.snk public.snk
3)对程序集进行延迟签名
csc /keyfile:public.snk /delaysign /t:library HelloWorld.cs
4)让CLR信任程序集的内容,不执行哈希处理
sn -Vr HelloWorld.dll
由于上面的命名会在注册表中添加相应项,因此对同一程序集只需执行一次。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification
这样,HelloWorld.dll就可以安装到GAC中(如果你愿意的话)
5)其他开发人员可以引用此程序集,就好像一般的强命名程序集一样
6)假如开发完成要进行最终部署的话,一定要用私钥进行签名。
否则,有人完全可以用这个公钥来做一个相同的程序集来替换掉你的这个程序集来做些坏事。
总之,程序集的安全会大打折扣。为此,让保管私钥的人来完成如下签名
sn -R HelloWorld.dll Blog.snk
注:我们不能单独提取出私钥,私钥和公钥是在一个文件中。公钥可以单独提取出来,以便于分发。
7)打开验证,在4)中的注册表项会被相应移除
sn -Vu HelloWorld.dll
08c7ccf7-13f4-446f-94ed-b4bffcc65f73|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags: 公钥, 签名, 程序, 哈希处理
防控BUG