96

我的一位同事非常热衷于签署大会。他真的试图签署任何东西。即使我们使用来自 Microsoft 的未签名程序集,他也会获取源代码,对其进行签名,然后要求其他开发人员使用他的副本。

我可以理解签署程序集背后的基本思想:确保特定程序集不会被一些狡猾的黑客破坏。因此,如果我们是一家软件开发公司,我们应该在向我们的客户发布一些 .NET 库之前签署我们的程序集。

但是,我们在这里主要开发自己使用的 Web 应用程序,我只是看不出对我们使用的每个程序集进行签名的意义。

我在这里错过了什么吗?

4

10 回答 10

61

我利用未签名的程序集来解决之前和在学术环境中向人们展示它的重要性的问题。我用相同名称、相同签名并使用.NET Reflector复制和粘贴原始代码的文件替换了一个未签名的 DLL 文件(再次在学术环境中),但在我的文件中,我通过电子邮件发送了用户名和密码在调用“真实”代码之前被传入。

如果签名,您可以进行签名匹配,但不能替换。与 Zippy 所说的相反,会出现运行时编译错误。

签署程序集永远不会过大。这需要 30 秒。这就像说如果你住在乡下,锁上你的门是矫枉过正的。如果你想用你的财物赌博,那就去吧,让它敞开着。只需一次安全漏洞即可被解雇。签署一个程序集只需 30 秒,而且没有不这样做的商业案例。性能影响可以忽略不计。

于 2010-03-08T19:36:44.157 回答
50

对在受信任的环境中使用的程序集进行签名对我来说听起来有点矫枉过正。

签名程序集的一个有趣之处在于,它们的加载速度比未签名程序集稍慢,因为它们必须经过加密验证。

为了签署一个程序集,它所依赖的任何程序集也必须签名。我的猜测是,这有助于您的同事签署所有内容的愿望——编译器要求它。


编辑自从写了这个答案,你可以看到赞成和反对阵营都有大致相同的支持。这里显然没有正确的答案。

不过,强制进行此编辑的一点是,如今我们从 NuGet 获取了如此多的开源库,其中许多根本没有签名。如果你想签署你的程序集,你还需要签署任何依赖项。许多已签名的开源库都有用于签名的私钥在其源存储库中公开可用。

与所有事情一样,需要进行权衡。根据我在私人环境中工作的经验,签名的好处主要是理论上的(或学术性的,正如@user289100提到的那样),除非你担心政府机构会修改你的代码,在这种情况下你需要对这么多级别的您签署的基础设施似乎只是少量的工作。否则,由于必须签署所有内容而引发的大量挑战似乎并不值得。但是,您的环境可能有不同的要求,或者您可能是受虐狂!

有关使用强名称时与版本控制程序集相关的挑战的信息,另请参阅Teun D 的答案

于 2009-07-28T22:41:06.170 回答
40

另外一点:对程序集进行签名会破坏版本的向后兼容性。您的参考文献都开始包含版本号,并且具有其他版本号的版本被认为是不兼容的。这阻碍了升级到较新版本的分布式程序集。

在我看来,如果您从中看到一些具体的收益,您应该只对程序集进行代码签名:

  • 如果您部署到不受信任的人可能会接触您的程序集的环境
  • 在某些插件模型中,您希望将证书用作升级信任的证据
  • 如果您的代码应该可以从其他签名代码中调用(比如 log4net 之类的项目,有理由签署他们的代码以广泛使用;他们几年前丢失了他们的密钥,极大地破坏了兼容性,这是代码签名的另一个风险) .
  • 如果你想部署到 GAC
于 2009-09-01T18:07:59.703 回答
9

你的同事有没有告诉你他为什么喜欢在大会上签名?此处尚未讨论的签名的一个优点是只能将已签名的程序集放入 GAC(即跨托管进程共享),但从我(诚然缺乏经验)的角度来看,缺点似乎超过了优点。

您关于自签名 Microsoft 代码的轶事对我来说似乎特别可疑。如果 MS 没有签署代码,可能是有原因的,对吧?并且通过签署它,当你没有写它时,你就是在为它负责——另一个让未来咬你的机会。

于 2009-07-28T22:46:19.217 回答
4

关于签署程序集的另一件事是,不能注入不正确的程序集来代替您的程序集(也-您自己偶然)。例如,如果您创建一个引用程序集 Foo.dll,版本 1.0 的程序,那么有人可以创建一个具有相同版本的程序集并替换您的程序集,当您签署您的库时,这是不可能的(在至少我认为这不容易)。

于 2009-07-28T23:10:01.697 回答
4

仅当程序集放置在 GAC 中时才需要签名,其他都不需要。已签名的程序集不会阻止某人与他们打交道。黑客仍然可以剥离签名和任何其他检查签名的代码。

于 2009-07-28T23:15:33.353 回答
3

我同意这似乎有点浪费。确实需要确保文件是您认为的那样(并且没有被篡改)。但是,如果您相信自己的网络安全和 Web 服务器的限制,那么签署您的 Web 程序集似乎是一个多余的步骤。

但也许这就是我的小企业经验。如果您谈论的是任务关键型在线银行网站,请退出。

于 2009-07-28T22:37:23.650 回答
2

如果您要运送某些东西和/或实际上有理由这样做,请考虑这样做。在其他情况下,这只是麻烦。我会问你的同事,他这样做实际上得到了什么。

我以前遇到过签名装配炎,这让我很痛苦,尤其是当您考虑到对签署装配几乎一无所知的人数、它的用途以及如何做时。除非绝对必要,否则这只是您不必担心的另一件事。

于 2009-07-28T23:24:14.337 回答
1

在从网络部署ClickOnce XBAP中使用您的程序集时,您需要对其进行签名。

此外,所有引用的程序集也需要签名。

于 2011-08-25T00:59:35.030 回答
1

我们签署我们的程序集是因为有时我们会遇到以下错误(这是来自测试,但可能在运行应用程序时发生):

System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

TearDown : System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

我们发现Visual Studio有时会出错并运行旧代码

如果您在运行旧代码时想要出错,请对您的程序集进行签名。

如果您正在编写nuget包,请签署您的程序集。对于想要确保我们正在运行最新版本的代码的我们来说,未签名的程序集很尴尬。 我无法修复 Visual Studio。我所能做的就是检测到 Visual Studio 弄错了。因此,请签署您的 nuget 程序集

于 2016-01-28T13:20:51.980 回答