不签署.NET程序集有什么问题吗?


94

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

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

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

我在这里想念什么吗?


1
此处值得注意的是一些混淆,“数字签名”(具有安全性)和“强命名程序集”,它们是dll地狱的修复程序,有助于GAC链接到库。使用一个或另一个是相似的,两者都可以在对程序集进行签名时谈到。似乎有些张贴者在考虑一个,而其他张贴者在考虑另一个或两者。
合并

Answers:


49

在可信环境中使用的程序集签名对我来说听起来像是过分地杀了。

关于签名程序集的一个有趣的观点是,由于必须对它们进行加密验证,因此它们的加载速度比未签名程序集要慢一些。

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


编辑自编写此答案以来,您可以看到赞成和反对阵营都得到大致等效的支持。显然这里没有正确的答案。

但是,迫使进行此编辑的要点是,如今我们从NuGet中获取了如此多的开源库,其中许多根本没有签名。如果要对程序集进行签名,则还需要对所有依赖项进行签名。已签名的许多开源库在其源存储库中都有公开可用的用于签名的私钥。

与所有其他因素一样,需要进行权衡。根据我在私人环境中工作的经验,签名的好处主要是理论上的(或学术上的,如@ user289100所述),除非您担心政府机构会修改您的代码,在这种情况下,您需要对如此多的级别产生偏执在您的基础架构中,签名似乎是一件小事。否则,因必须签署所有协议而产生的大量挑战似乎并不值得。但是,您的环境可能有不同的要求,或者您可能是受虐狂!

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


17
同意,这对他来说就像是上瘾了
珍妮(Janie)2009年

3
还有一点要注意的是,如果要在不同的应用程序之间共享该程序集,则必须签名(即GAC)。
rajesh pillai 09年

60

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

如果已签名,则可以使签名匹配,但不能替换。与Zippy所说的相反,它将出现运行时编译错误。

对程序集进行签名永远不过分。这需要30秒。这就像说,如果您住在乡下,锁上门实在是太过分了。如果您要赌博,请继续打开它。只需执行一次安全漏洞即可被解雇。签署大会只需要30秒,而且没有任何商业案例。对性能的影响可以忽略不计。


11
如果黑客可以更改dll,他还可以更改调用该dll的应用程序。
ZippyV

12
这是正确的Zippy,但是如果没有用于对应用程序进行签名的密钥,那么他们将很难使应用程序在仅允许原始应用程序的签名版本运行的环境中运行,在某些情况下就是这种情况。我曾经工作过的环境。您缺少树木的森林:如果不签署程序集,则将承担不必要的安全风险,需要30秒才能避免,并且没有我从未见过的业务案例或现实案例签署大会。
user289100'2

39

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

我认为,只有在看到一些具体收益的情况下,才应该对程序集进行代码签名:

  • 如果您部署到不受信任的人可能会触摸您的程序集的环境
  • 在某些插件模型中,您要使用证书作为升级信任的证据
  • 如果您的代码可以从其他已签名的代码中调用(例如log4net这样的项目,则有理由对其代码进行广泛使用;他们在几年前通过丢失密钥来破坏兼容性,这是另一种代码签名的风险) 。
  • 如果您想部署到GAC

9

您的同事有没有给他任何迹象表明他为什么喜欢签署大会?签名的一个优点(此处尚未讨论)是,只有签名的程序集可以放在GAC中(即在托管流程之间共享),但是从我(公认的经验不足)的角度来看,缺点似乎确实大于缺点。

您对Microsoft的自签名代码的轶事在我看来尤其令人怀疑。如果MS没有对代码签名,可能是有原因的,对吧?通过签名,您可以在不写的时候对它负责,这是未来咬你的又一次机会。


2
实际上我不确定为什么,但是微软当然没有签署Enterprise Library 3.1
oscarkuo

1
为什么在流程之间共享程序集要求程序集在GAC中?
Dirk Vollmar,2009年

4
并不是说您不能共享对同一.dll的运行时引用,而是只有具有强名称的程序集(即已签名的程序集)才能进入GAC-并将程序集放入GAC中,以便它们可以共享。
丹·戴维斯·布拉克特

4

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


4

仅当程序集放置在GAC中时才需要签名,否则就没有其他要求。已签名的程序集不会阻止他人对其进行弄乱。黑客仍然可以删除签名和检查签名的任何其他代码。


2
对于Web应用程序,黑客还必须修改web.config。
Tangurena

3
如果黑客可以从程序集中删除签名,则web.config也不会停止签名。
ZippyV 2011年

4
建议下载者阅读ianpicknell.blogspot.com/2010/02/…以及与之链接的类似文章。
君士坦丁

1
当前:是和否。我试过了,Windows默认是不检查签名(“强名称”)。可能是用户友好的:-)引用的链接显示了要添加到App.config中以强制执行签名检查的内容。然后,与文章相反,签名检查确实有效并检测到任何篡改,无论是版本nr还是内容。
罗兰

3

我同意这似乎有点浪费。确实需要确保文件符合您的实际想法(并且未被篡改)。但是,如果您信任自己的网络安全性和Web服务器的限制,则对Web程序集进行签名似乎是多余的步骤。

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


2

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

我之前曾遇到过签名式汇编炎,这在后部很痛苦,尤其是当您考虑到很少或根本不知道签名汇编的人的数量,用途和操作方法时。除非绝对必要,否则您不必担心自己。



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程序集上签名


更新:使用无符号程序集的潮流正在胜利;)我们以不同的方式解决上述问题:从空目录或“干净”目录开始在CI服务器上进行构建和测试。也许我们的开发机器上有本地场景,但很少发生或没有太大实际影响。
克莱·伦哈特
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.