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

osc*_*kuo 93 .net strongname

我的一位同事非常热衷于签署集会.他确实试图签署任何东西.即使我们使用未经签名的Microsoft程序集,他也会获取源代码,签名,然后请其他开发人员使用他的副本.

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

但是,我们主要在这里开发自己使用的Web应用程序,而我无法看到签署我们使用的每个程序集的重点.

我在这里错过了什么吗?

use*_*100 60

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

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

签名组件永远不会过度.这需要30秒.这就像说如果你住在这个国家,锁门就是矫枉过正.如果你想赌你的财物,请继续,保持开放.它只需要一次安全漏洞就会被解雇.签署一个程序集只需要30秒,而且没有商业案例.性能影响可以忽略不计.

  • 这是正确的Zippy,但没有密钥签署应用程序然后他们将很难让应用程序在只允许运行原始应用程序的签名版本的环境中运行,这将是几个我曾经工作过的环境.你错过了树木的森林:没有签署一个集会正在承担不必要的安全风险,需要30秒才能避免,并且没有任何商业案例或现实世界的案例我见过没有签署一个集会. (12认同)
  • 如果黑客可以更改dll,他也可以更改调用dll的应用程序. (11认同)

Dre*_*kes 48

在可信环境中使用的签名程序集对我来说听起来有点过分.

对签名程序集的一个有趣的观点是它们加载的速度比无符号程序集稍慢,因为它们必须通过加密验证.

要对程序集进行签名,还必须对其所依赖的任何程序集进行签名.我的猜测是,这有助于你的同事签署所有内容的愿望 - 编译器要求它.


编辑自写这个答案后,您可以看到职业选手和反对阵营都有大致相同的支持.这里显然没有正确的答案.

强迫这种编辑的要点是,现在我们从NuGet中获取了如此多的开源库,其中许多都没有签名.如果要对程序集进行签名,则还需要签署任何依赖项.许多签名的开源库都有用于在其源存储库中公开签名的私钥.

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

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

  • 同意,这对他来说就像是一个瘾君子 (17认同)
  • 还有一点需要注意的是,如果要在不同的应用程序中共享此程序集,则必须签名(即GAC). (3认同)

Teu*_*n D 38

还有一点:签署程序集会破坏版本的向后兼容性.您的引用都开始包含版本号,其他版本号的版本被认为是不兼容的.这阻碍了升级到更新版本的分布式组件.

在我看来,如果你从中看到一些具体的收益,你应该只对代码签名:

  • 如果部署到不受信任的人可能触及程序集的环境中
  • 在某些插件模型中,您希望使用证书作为升级信任的证据
  • 如果你的代码应该可以从其他签名代码中调用(像log4net这样的项目,有理由认为它们的代码可以广泛使用;它们几年前因丢失密钥而大大增加了兼容性,这是代码签名的另一个风险) .
  • 如果要部署到GAC


Dan*_*ett 9

你的同事有没有给你任何迹象表明他为什么喜欢签署集会?此处尚未讨论的签名的一个优点是,只有签名的程序集才能放入GAC(即在托管进程之间共享),但缺点似乎超过了我(公认的经验不足)的优势.

关于自签名微软代码的轶事似乎对我特别怀疑.如果MS没有签署代码,那可能是有原因的,对吧?通过签署,当你没有写下它时,你就要承担责任 - 这是未来咬你的另一个机会.

  • 这并不是说你不能共享同一个.dll的运行时引用,只有具有强名称的程序集(即签名的程序集)才能进入GAC - 并且程序集被放入GAC中以便它们可以共享. (4认同)
  • 实际上我不确定为什么,但微软肯定没有签署企业库3.1 (2认同)