C#:为什么要签一个集会?

问题描述 投票:138回答:6

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

  • 为什么前一位作者会以这种方式签署集会?
  • 是否需要签署程序集以及未签名会出现什么问题?
  • 签署程序集有什么缺点 - 是否会导致延迟?
c# assemblies
6个回答
174
投票

为什么前一位作者会以这种方式签署集会?

不知道,也许他希望他的所有组件都用相同的密钥签名。

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

不,它没有必要,但它是一种允许您确保装配的真实性的机制。它允许您确保程序集未被篡改,实际上它来自该作者。如果您想将它们放入GAC,也是必要的。

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

签名的程序集只能加载其他已签名的程序集。此外,它们与特定版本绑定,这意味着如果要使用其他版本,则需要使用绑定重定向或重新编译应用程序。由于签名的验证,还有一点性能开销,但它很少,你不应该担心。


33
投票

如果要将它们放在GAC中,则需要对程序集进行签名。

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

Richard Grimes在.NET写了一篇关于安全性的好讲座,其中包括一章:Security Workshop

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


17
投票

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


1
投票

尽管签署dll的所有用法,dll应签署只有两个原因

1.版本控制

2.认证

一个。版本控制表示dll构建的版本,并且在将它们推入GAC时,可以存在两个具有相同名称的dll但版本不同

湾身份验证表示dll是否未被篡改,并且在创建时确实存在相同的内容。

如果您想了解更多有关基础知识和dll签名的信息,请参阅here


1
投票

除了现有的答案之外,我还要补充一点,当您的DLL将被第三方软件动态加载和使用时,您必须使用签名。这本身并不是技术要求,但是第三方软件生产商强制执行此类策略应该是安全问题,这是非常普遍的。

必须签署程序集的示例:

  • 开发Windows Shell / Windows资源管理器扩展,例如:Windows资源管理器的上下文菜单扩展
  • 开发Visual Studio扩展,例如:项目/项目模板向导GUI

0
投票

签名和组装很重要。为了确保仅安装在该PC上的exe或程序集。

即:如果你复制该文件夹并放入另一台PC,它将无法正常工作。因为它只是将该程序集签名到该机器。

© www.soinside.com 2019 - 2024. All rights reserved.