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

Cra*_*ton 143 c# assemblies

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

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

Dar*_*rov 179

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

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

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

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

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

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

  • 请注意,将签名验证放入GAC后,不再进行验证(自.NET 2.0开始)。[将其添加到GAC时仅发生一次](http://davidyardy.com/archive/strong-names-and-signing-assemblies-netaspx/)。 (2认同)

Han*_*son 33

如果要将它们放入GAC,则需要对程序集进行签名.

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

Richard Grimes撰写了一篇关于.NET安全性的精彩研讨会,其中包括一章:Security Workshop

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


Pie*_*kel 17

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


Tri*_*aly 8

这里的大多数回复都暗示强命名可以提供安全性。但出于安全考虑,微软建议不要使用它。

\n

目前关于强名称签名的文档说:

\n
\n

\xe2\x9a\xa0 警告

\n

不要依赖强名称来确保安全。它们仅提供唯一的身份。

\n
\n

它对于确保您拥有所需的二进制文件最有用,而不是偶然具有相同名称和版本(或通过绑定重定向设置的版本)的不同二进制文件

\n

Microsoft 列出了使用强命名的原因:

\n
\n
    \n
  • 您希望使您的程序集能够被强名称程序集引用,或者您希望允许好友从其他强名称程序集访问您的程序集。
  • \n
  • 应用程序需要访问同一程序集的不同版本。这意味着您需要不同版本的程序集在同一应用程序域中并行加载而不发生冲突。例如,如果具有相同简单名称的程序集中存在 API 的不同扩展,则强命名会为程序集的每个版本提供唯一标识。
  • \n
  • 您不希望使用程序集对应用程序的性能产生负面影响,因此您希望程序集保持域中立。这需要强命名,因为域中立的程序集必须安装在全局程序集缓存中。
  • \n
  • 您希望通过应用发布者策略来集中为应用程序提供服务,这意味着程序集必须安装在全局程序集缓存中。
  • \n
\n
\n

它还指出:

\n
\n

对于 .NET Core,强名称程序集不提供实质性好处。

\n
\n

\n
\n

如果您是开源开发人员,并且希望获得强名称程序集的身份优势以更好地与 .NET Framework 兼容,请考虑将与程序集关联的私钥签入源代码控制系统。

\n
\n

因此,微软表示可以将强命名私钥与代码一起发布。这意味着任何人都可以使用正确的公钥创建强名称程序集。我想说的是,可以安全地假设强命名不是真实性的安全来源。

\n

在这里阅读更多相关信息:https ://learn.microsoft.com/en-us/dotnet/standard/ assembly/strong-named

\n