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


146

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

  • 为什么以前的作者会以这种方式对程序集签名?
  • 签名程序集是必需的吗?不签名怎么办?
  • 签名程序集有什么缺点-​​会导致延迟吗?

Answers:


186

为什么以前的作者会以这种方式对程序集签名?

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

签署程序集是否必要?不签署程序集又会有什么问题呢?

不,不是必须的,但这是一种机制,可让您确保组件的真实性。它使您可以确保程序集未被篡改,并且确实来自作者。如果要将它们放入GAC,也很有必要。

签名程序集有什么缺点-​​会导致延迟吗?

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


2
请注意,将签名验证放入GAC后,不再进行验证(自.NET 2.0开始)。将其添加到GAC时,它只会发生一次
亚伯

1
您如何看待当今的签名?在基于Web的系统上?如果我是对的,那么只有在谈论已安装的软件时才需要,对吗?如果我使用TFS将应用发布到Azure,我知道它没有被篡改,对吗?还是我缺少一些安全性部分?
瑞克·沃尔夫

关于第一个问题:他从具有程序集签名密钥文件的项目中制作了项目模板,然后用该项目模板创建了其他东西,却忘记了替换密钥文件。(只需将“他”替换为“我”,您就会知道我今天早上在做什么:))。因此,这是偶然的。
hardyVeles18年

33

如果要将程序集放入GAC中,则需要签名。

如果您对可执行文件进行签名,则它链接到的所有类库也都需要签名。如果您使用的是第三方库(尤其是需要使用ActiveX控件或类似控件),则可能会很难。

理查德·格里姆斯(Richard Grimes)写了一篇有关.NET安全的很好的讲习班,其中包括有关这一章的章节:安全讲习班

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


17

对程序集进行签名的一个非常重要的原因是可以确保它是您的程序集。由于私钥是您的,所以没有其他人可以使用相同的密钥对程序集进行签名。这意味着,如果程序集的公钥是您知道的(您可以使用GetType().Assembly.GetName().GetPublicKey()函数来检索它),则该程序集是您的,并且未被篡改。


1

尽管对dll进行所有签名,但仅出于两个原因就应该对dll进行签名

1.版本控制

2.认证

一个。版本控制表示dll已建立在哪个版本上,并将其推入GAC时,可以存在两个具有相同名称的dll,但版本不同

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

如果您想了解更多有关基础知识和dll签名的信息,可以在这里参考


1
您如何看待当今的签名?在基于Web的系统上?如果我是对的,那么只有在谈论已安装的软件时才需要,对吗?如果我使用TFS将应用发布到Azure,我知道它没有被篡改,对吗?还是我缺少一些安全性部分?
瑞克·沃尔夫

1
我看不出为什么现在要对一个dll进行签名的原因,该dll将作为Paas解决方案进行部署。但是,如果您拥有iaas解决方案,则可以在同一iis中通过Web应用程序重用dll。我不建议这样做。我们应该通过api网址来调用它们,而不是使用GAC(微服务体系结构)中的那些dll。
Karthikeyan VK

1

除了现有的答案,我还要补充一点,当您的DLL将被第三方软件动态加载和使用时,您必须使用签名。出于安全方面的考虑,第三方软件生产商强制执行此类策略本身不是技术要求,而是很普遍的做法,因此是很合理的。

必须在程序集上签名的示例:

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

0

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

即:如果您将该文件夹复制并放入另一台PC,它将不起作用。因为它仅将程序集登录到该计算机。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.