C# 为什么要在集会上签名?

C# 为什么要在集会上签名?,c#,assemblies,C#,Assemblies,在我接管的一些C代码(在VisualStudio2005中)中,我注意到程序集都使用相同的.snk文件签名 为什么前一位作者会以这种方式签署程序集 是否需要对程序集进行签名?什么 不签字会错吗 这方面有什么缺点 签名程序集-是否会导致延迟 如果要将程序集放入目录中,则需要对程序集进行签名 如果对可执行文件进行签名,那么它链接到的任何类库也需要进行签名。如果您使用的是第三方库(特别是如果您需要使用控件或类似控件),这可能会很困难 Richard Grimes在中编写了一篇关于安全性的优秀研讨会,

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

  • 为什么前一位作者会以这种方式签署程序集
  • 是否需要对程序集进行签名?什么 不签字会错吗
  • 这方面有什么缺点 签名程序集-是否会导致延迟

如果要将程序集放入目录中,则需要对程序集进行签名

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

Richard Grimes在中编写了一篇关于安全性的优秀研讨会,其中包括一章:

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

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

不知道,也许他想让他的所有程序集都用同一个密钥签名

是否有必要对程序集进行签名?不签名会有什么问题

不需要,但它是一种允许您确保程序集真实性的机制。它允许您确保一个程序集没有被篡改,并且它确实来自于这个作者。如果你想把它们放进GAC,这也是必要的

对程序集进行签名有哪些缺点?会导致延迟吗


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

对程序集进行签名的一个非常重要的原因是,您可以确保它是您的程序集。由于私钥是您的,因此其他人无法使用该密钥对程序集进行签名。这意味着,当程序集的公钥是您知道的公钥时(您可以使用
GetType().assembly.GetName().GetPublicKey()
函数检索该公钥),该程序集是您的,并且未被篡改。

尽管使用了签名dll的所有方法,但对dll进行签名的原因只有两个

1。版本控制

2。身份验证

a。版本控制表示dll构建的版本,当将它们推入GAC时,可以存在两个同名但版本不同的dll

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


如果您想了解更多有关基本知识和dll签名的信息,除了现有答案外,您还可以参考

,我想补充一点,当您的dll将被第三方软件动态加载和使用时,您必须使用签名。这本身不是技术要求,但第三方软件生产商出于安全考虑实施此类策略是合理的,因此非常常见

必须对程序集进行签名的示例:

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

签名和组装很重要。 以确保仅在该电脑上安装exe或程序集


Ie:如果你复制那个文件夹并把它放到另一台电脑里,它就不工作了。因为它只是在那台机器上签名。请原谅我回答了一个老问题。但这里的大多数回答都暗示,强命名提供了安全性。但是微软建议不要为了安全而使用它

强名称签名的文档当前显示:

⚠ 警告

不要依赖强名称来保证安全性。它们只提供了一个独特的身份

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

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

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

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

如果您是一个开源开发人员,您希望得到一个强名称的程序集的身份好处,以便更好地与.NET框架兼容,请考虑签入与之关联的私钥。