C#:为什么要签署一个程序集?

在我接pipe的一些C#代码中(在Visual Studio 2005中),我注意到程序集都使用相同的.snk文件签名。

  • 为什么以前的作者用这种方式签署了议会呢?
  • 签署组件是否必要,什么是不签名?
  • 签署程序集有什么缺点 – 是否会导致延迟?

为什么以前的作者用这种方式签署了议会呢?

不知道,也许他想让他所有的集会都用同样的钥匙签名。

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

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

签署程序集有什么缺点 – 是否会导致延迟?

签名的程序集只能加载其他签名的程序集。 此外,它们绑定到特定的版本,这意味着如果您想使用不同的版本,则需要使用绑定redirect或重新编译应用程序。 由于签名的validation,还有一点性能开销,但它太less,你不应该关心。

如果要将它们放入GAC,则需要签署程序集。

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

理查德·格里姆斯(Richard Grimes)在.NET中撰写了一个关于安全性的良好研讨会,其中包括一章: 安全研讨会

所有程序集使用相同的.snk文件签名的原因可能是他使用了代码覆盖的unit testing。 为了能够执行代码覆盖(至less使用内置于Visual Studio 2005testing版本的工具),并且如果程序集已签名,则需要指定用于签名的.snk文件,但我认为您只能为整个解决scheme指定一个.snk文件,所以如果您使用不同的.snk文件签名各种类库,您一次只能检查其中一个的代码覆盖率。

签署一个会议的一个非常重要的原因是你可以确定这是你的会议。 由于私钥是您的,所以没有其他人可以使用同一个密钥签署程序集。 这意味着,当一个程序集的公钥是一个你知道的(你可以使用GetType().Assembly.GetName().GetPublicKey()函数)来获取这个程序集,程序集就是你自己的,并没有被篡改。

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

1.版本控制

2.authentication

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

湾 身份validation表示该dll是否被篡改,并且在创build时确实存在。

如果你想了解更多的基础知识和DLL签名,你可以参考这里