在我接管的一些C#代码中(在Visual Studio 2005中),我注意到这些程序集都使用相同的.snk
文件进行了签名。C#:为什么要签署一个程序集?
- 为什么以前的作者用这种方式签署了程序集?
- 是否需要签署程序集,以及 在签名时会出错?
- 签名程序集有什么缺点 - 它会导致延迟吗?
在我接管的一些C#代码中(在Visual Studio 2005中),我注意到这些程序集都使用相同的.snk
文件进行了签名。C#:为什么要签署一个程序集?
为什么以前的作者用这种方式签署了程序集?
不知道,也许他想让他所有的程序集都用相同的密钥签名。
是否需要签署程序集以及未签署程序时会出现什么问题?
不,这不是必要的,但它是一种机制,可以确保装配的真实性。它可以让你确保程序集没有被篡改,而且它确实源自于这位作者。如果您想将它们放入GAC,也是必要的。
签署程序集有什么不利之处 - 它会导致延迟吗?
签名的程序集只能加载其他签名的程序集。此外,它们与特定版本绑定,这意味着如果您想使用不同的版本,则需要使用绑定重定向或重新编译应用程序。由于对签名进行了验证,所以性能开销也有一些小问题,但它很少,您不应该担心。
如果您想将它们放在GAC中,则需要签署程序集。
如果您签署了可执行文件,那么它链接到的任何类库也需要进行签名。如果您使用第三方库(如果您需要使用ActiveX控件或类似工具),这可能会很困难。
理查德·格里姆斯已经.NET写安全良好的车间,并包括了在这一章:Security Workshop
原因所有组件用相同的.snk文件签署的可能是,如果他使用的单位测试代码覆盖率。为了能够执行代码覆盖(至少使用视觉 Studio 2005的测试版内置的工具),并且如果程序集已签名,则需要指定用于签名的.snk文件,但我认为您只能为整个解决方案指定一个.snk文件,因此如果您使用不同的.snk文件签署各种类库,则一次只能检查其中一个的代码覆盖率。
移到http://www.grimes.nildram.co.uk/workshops.htm – LiamV 2013-08-28 08:15:54
@LiamV谢谢,更新。 – 2013-08-28 11:52:04
签署装配体的一个非常重要的原因是您可以确定它是您的装配体。由于私钥是你的,所以没有其他人可以使用同一个密钥签署程序集。这意味着当一个程序集的公钥是一个你知道的(你可以使用GetType().Assembly.GetName().GetPublicKey()
函数检索这个程序集),程序集是你的,并且它没有被篡改。
签署DLL的所有用途的Inspite,该dll应该只有两个原因
1版本
2.认证
一个签名。版本控制表示dll的版本是什么版本,同时将它们推入到GAC中,同名的两个dll可以存在,但版本不同
b。身份验证表示该dll是否未被篡改,并且在创建时确实存在。
如果您想了解更多有关的基础知识和DLL签名您可以参考here
你现在对签名有什么看法?在基于Web的系统上?如果我是正确的,那么只有在谈论已安装的软件时才是必要的,对吗?如果我使用TFS将我的应用程序发布到Azure,我知道它没有被篡改,对吧?或者我错过了一些安全部分? – 2017-05-08 14:11:50
我没有看到为什么我们现在应该签署一个dll,这将在Azure中部署为Paas解决方案。但是,如果你有iaas解决方案,你可以在同一个iis中通过web应用程序重用dll。我不推荐。我们应该通过API调用它们,而不是使用来自GAC(微服务架构)的这些dll。 – 2017-05-09 04:54:47
明智的答案 – Eon 2014-04-15 11:48:49
请注意,放置在GAC中时,验证签名不会再发生(自.NET 2.0开始); [只有在将其添加到GAC时才会发生一次](http://davidyardy.com/archive/strong-names-and-signing-assemblies-netaspx/)。 – Abel 2016-10-12 18:25:10
你觉得现在签署它怎么样?在基于Web的系统上?如果我是正确的,那么只有在谈论已安装的软件时才是必要的,对吗?如果我使用TFS将我的应用程序发布到Azure,我知道它没有被篡改,对吧?或者我错过了一些安全部分? – 2017-05-08 14:12:04