2010-10-20 72 views
120

在我接管的一些C#代码中(在Visual   Studio   2005中),我注意到这些程序集都使用相同的.snk文件进行了签名。C#:为什么要签署一个程序集?

  • 为什么以前的作者用这种方式签署了程序集?
  • 是否需要签署程序集,以及 在签名时会出错?
  • 签名程序集有什么缺点 - 它会导致延迟吗?

回答

138

为什么以前的作者用这种方式签署了程序集?

不知道,也许他想让他所有的程序集都用相同的密钥签名。

是否需要签署程序集以及未签署程序时会出现什么问题?

不,这不是必要的,但它是一种机制,可以确保装配的真实性。它可以让你确保程序集没有被篡改,而且它确实源自于这位作者。如果您想将它们放入GAC,也是必要的。

签署程序集有什么不利之处 - 它会导致延迟吗?

签名的程序集只能加载其他签名的程序集。此外,它们与特定版本绑定,这意味着如果您想使用不同的版本,则需要使用绑定重定向或重新编译应用程序。由于对签名进行了验证,所以性能开销也有一些小问题,但它很少,您不应该担心。

+3

明智的答案 – Eon 2014-04-15 11:48:49

+0

请注意,放置在GAC中时,验证签名不会再发生(自.NET 2.0开始); [只有在将其添加到GAC时才会发生一次](http://davidyardy.com/archive/strong-names-and-signing-assemblies-netaspx/)。 – Abel 2016-10-12 18:25:10

+0

你觉得现在签署它怎么样?在基于Web的系统上?如果我是正确的,那么只有在谈论已安装的软件时才是必要的,对吗?如果我使用TFS将我的应用程序发布到Azure,我知道它没有被篡改,对吧?或者我错过了一些安全部分? – 2017-05-08 14:12:04

31

如果您想将它们放在GAC中,则需要签署程序集。

如果您签署了可执行文件,那么它链接到的任何类库也需要进行签名。如果您使用第三方库(如果您需要使用ActiveX控件或类似工具),这可能会很困难。

理查德·格里姆斯已经.NET写安全良好的车间,并包括了在这一章:Security Workshop

原因所有组件用相同的.snk文件签署的可能是,如果他使用的单位测试代码覆盖率。为了能够执行代码覆盖(至少使用视觉  Studio   2005的测试版内置的工具),并且如果程序集已签名,则需要指定用于签名的.snk文件,但我认为您只能为整个解决方案指定一个.snk文件,因此如果您使用不同的.snk文件签署各种类库,则一次只能检查其中一个的代码覆盖率。

+0

移到http://www.grimes.nildram.co.uk/workshops.htm – LiamV 2013-08-28 08:15:54

+0

@LiamV谢谢,更新。 – 2013-08-28 11:52:04

15

签署装配体的一个非常重要的原因是您可以确定它是您的装配体。由于私钥是你的,所以没有其他人可以使用同一个密钥签署程序集。这意味着当一个程序集的公钥是一个你知道的(你可以使用GetType().Assembly.GetName().GetPublicKey()函数检索这个程序集),程序集是你的,并且它没有被篡改。

1

签署DLL的所有用途的Inspite,该dll应该只有两个原因

1版本

2.认证

一个签名。版本控制表示dll的版本是什么版本,同时将它们推入到GAC中,同名的两个dll可以存在,但版本不同

b。身份验证表示该dll是否未被篡改,并且在创建时确实存在。

如果您想了解更多有关的基础知识和DLL签名您可以参考here

+1

你现在对签名有什么看法?在基于Web的系统上?如果我是正确的,那么只有在谈论已安装的软件时才是必要的,对吗?如果我使用TFS将我的应用程序发布到Azure,我知道它没有被篡改,对吧?或者我错过了一些安全部分? – 2017-05-08 14:11:50

+1

我没有看到为什么我们现在应该签署一个dll,这将在Azure中部署为Paas解决方案。但是,如果你有iaas解决方案,你可以在同一个iis中通过web应用程序重用dll。我不推荐。我们应该通过API调用它们,而不是使用来自GAC(微服务架构)的这些dll。 – 2017-05-09 04:54:47

相关问题