在我接管的一些C#代码中(在Visual Studio 2005中),我注意到程序集都使用相同的.snk
文件进行签名。
答案 0 :(得分:169)
为什么前一位作者会以这种方式签署集会?
不知道,也许他希望所有的集会都用相同的钥匙签名。
是否需要签署程序集以及不签名会出现什么问题?
不,没有必要,但它是一种允许您确保装配的真实性的机制。它允许您确保程序集未被篡改,实际上它来自该作者。如果您想将它们放入GAC,也是必要的。
签署程序集有什么缺点 - 是否会导致延迟?
签名的程序集只能加载其他已签名的程序集。此外,它们与特定版本绑定,这意味着如果要使用其他版本,则需要使用绑定重定向或重新编译应用程序。由于签名的验证,还有一点性能开销,但它很少,你不应该担心。
答案 1 :(得分:33)
如果要将程序集放在GAC中,则需要对程序集进行签名。
如果您签署了可执行文件,那么它所链接的任何类库也需要签名。如果您使用第三方库(特别是如果您需要使用ActiveX控件或类似文件),这可能会很困难。
Richard Grimes在.NET撰写了一篇关于安全性的优秀研讨会,其中包括一章: Security Workshop
使用相同的.snk文件签署所有程序集的原因可能是他使用了代码覆盖率的单元测试。为了能够进行代码覆盖(至少使用Visual Studio 2005测试版中内置的工具),如果程序集已签名,则需要指定用于签名的.snk文件,但我认为你只能为整个解决方案指定一个.snk文件,因此如果您使用不同的.snk文件对各个类库进行签名,则一次只能检查其中一个的代码覆盖率。
答案 2 :(得分:17)
签署装配的一个非常重要的原因是,您可以确定它是您的装配。由于私钥是您的,因此没有其他人可以使用相同的密钥签署程序集。这意味着当程序集的公钥是您知道的(您可以使用GetType().Assembly.GetName().GetPublicKey()
函数检索它)时,程序集就是您的,并且它没有被篡改。
答案 3 :(得分:2)
如果您能请我回答一个老问题。但是,这里的大多数回复都暗示了强命名可以提供安全性。但是Microsoft建议不要将其用于安全性。
有关强名签名的文档当前显示:
⚠警告
请勿依赖强名来保证安全性。它们仅提供唯一的身份。
对于确保您拥有所需的二进制文件,而不是偶然使用具有相同名称和版本(或通过绑定重定向设置的版本)的其他二进制文件,这非常有用
Microsoft列出了使用强命名的原因:
- 您想使您的程序集能够被强名称程序集引用,或者您希望授予朋友访问其他强名称程序集的程序集的权限。
- 应用程序需要访问同一程序集的不同版本。这意味着您需要不同版本的程序集并排加载到同一应用程序域中而不会发生冲突。例如,如果在具有相同简单名称的程序集中存在API的不同扩展,则强命名将为程序集的每个版本提供唯一的标识。
- 您不想对使用程序集的应用程序的性能产生负面影响,因此您希望程序集不受域限制。这需要强命名,因为必须在全局程序集缓存中安装与域无关的程序集。
- 您要通过应用发布者策略集中为应用程序提供服务,这意味着必须将程序集安装在全局程序集缓存中。
它还指出:
对于.NET Core,强名称程序集不会带来实质性的好处。
和
如果您是开放源代码的开发人员,并且希望使用强命名程序集的身份好处以更好地与.NET Framework兼容,请考虑将与程序集关联的私钥签入源控制系统。
因此,微软表示,可以将您的强命名私钥与代码一起发布。意味着任何人都可以使用正确的公钥创建强名称的程序集。我想说,可以肯定地说,强命名不是真实性的可靠来源。
在此处详细了解:https://docs.microsoft.com/en-us/dotnet/standard/assembly/strong-named
答案 4 :(得分:1)
除了现有的答案外,我还补充说,当您的DLL将被第三方软件动态加载和使用时,您必须使用签名。第三方软件生产商出于安全方面的考虑而执行此类策略,这本身并不是技术要求,而是很普遍的合理做法。
必须在程序集上签名的示例:
答案 5 :(得分:0)
签名和组装很重要。 为了确保仅在该PC上安装exe或程序集。
即:如果您将该文件夹复制并放入另一台PC,它将不起作用。因为它仅将程序集登录到该计算机。