我的一位同事非常热衷于签名程序集。他从字面上试图签署任何东西。即使我们使用未签名的Microsoft程序集,他也将获取源代码,对其进行签名,然后要求其他开发人员改用他的副本。
我可以理解签署程序集背后的基本思想:确保某个狡猾的黑客不会破坏特定程序集。因此,如果我们是软件开发公司,则应在向用户发布一些.NET库之前对程序集进行签名。
但是,我们主要是在这里开发供自己使用的Web应用程序,我只是看不到对我们使用的每个程序集进行签名的意义。
我在这里想念什么吗?
我的一位同事非常热衷于签名程序集。他从字面上试图签署任何东西。即使我们使用未签名的Microsoft程序集,他也将获取源代码,对其进行签名,然后要求其他开发人员改用他的副本。
我可以理解签署程序集背后的基本思想:确保某个狡猾的黑客不会破坏特定程序集。因此,如果我们是软件开发公司,则应在向用户发布一些.NET库之前对程序集进行签名。
但是,我们主要是在这里开发供自己使用的Web应用程序,我只是看不到对我们使用的每个程序集进行签名的意义。
我在这里想念什么吗?
Answers:
在可信环境中使用的程序集签名对我来说听起来像是过分地杀了。
关于签名程序集的一个有趣的观点是,由于必须对它们进行加密验证,因此它们的加载速度比未签名程序集要慢一些。
为了对程序集进行签名,它所依赖的任何程序集也必须进行签名。我的猜测是,这有助于您的同事签署所有内容的愿望-编译器正在要求它。
编辑自编写此答案以来,您可以看到赞成和反对阵营都得到大致等效的支持。显然这里没有正确的答案。
但是,迫使进行此编辑的要点是,如今我们从NuGet中获取了如此多的开源库,其中许多根本没有签名。如果要对程序集进行签名,则还需要对所有依赖项进行签名。已签名的许多开源库在其源存储库中都有公开可用的用于签名的私钥。
与所有其他因素一样,需要进行权衡。根据我在私人环境中工作的经验,签名的好处主要是理论上的(或学术上的,如@ user289100所述),除非您担心政府机构会修改您的代码,在这种情况下,您需要对如此多的级别产生偏执在您的基础架构中,签名似乎是一件小事。否则,因必须签署所有协议而产生的大量挑战似乎并不值得。但是,您的环境可能有不同的要求,或者您可能是受虐狂!
有关使用强名称时与版本化程序集相关的挑战的信息,另请参见Teun D的答案。
我利用未签名的程序集来解决问题,然后在学术环境中向人们展示了为什么它很重要。我用一个用相同名称,相同签名制作的DLL文件替换了未签名的(再次在学术环境中),并使用.NET Reflector复制和粘贴了原始代码,但是在我的书中,我通过电子邮件将用户名和密码发送给了我在调用“真实”代码之前被传递。
如果已签名,则可以使签名匹配,但不能替换。与Zippy所说的相反,它将出现运行时编译错误。
对程序集进行签名永远不过分。这需要30秒。这就像说,如果您住在乡下,锁上门实在是太过分了。如果您要赌博,请继续打开它。只需执行一次安全漏洞即可被解雇。签署大会只需要30秒,而且没有任何商业案例。对性能的影响可以忽略不计。
您的同事有没有给他任何迹象表明他为什么喜欢签署大会?签名的一个优点(此处尚未讨论)是,只有签名的程序集可以放在GAC中(即在托管流程之间共享),但是从我(公认的经验不足)的角度来看,缺点似乎确实大于缺点。
您对Microsoft的自签名代码的轶事在我看来尤其令人怀疑。如果MS没有对代码签名,可能是有原因的,对吧?通过签名,您可以在不写的时候对它负责,这是未来咬你的又一次机会。
仅当程序集放置在GAC中时才需要签名,否则就没有其他要求。已签名的程序集不会阻止他人对其进行弄乱。黑客仍然可以删除签名和检查签名的任何其他代码。
我们对程序集进行签名是因为有时会出现类似以下的错误(这是来自测试,但在运行应用程序时可能会发生):
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程序集上签名。