强名称/签名程序集的优缺点

8
我们有一个包含许多项目的解决方案(可能有20个或更多)。最近,我们进行了一些更改,需要从COM调用其中的一些程序集,这意味着我们需要对它们进行强名称。这些程序集引用了我们项目中的其他程序集,这意味着它们也需要进行强命名。它们还具有InternalsVisibleTo属性,因此被授予权限的程序集也必须进行强名称。
我建议不要费力去查找哪些程序集需要签名/强命名,而是建议我们将它们全部进行强命名。这使得一些人感到担忧。我认为没有风险,但他们想知道签名程序集的优缺点。我能想到的只有以下内容:
优点
- 从COM调用程序集是必需的。 - 它允许我们将程序集放入GAC(我们现在没有这样做)。 - 它可以防止篡改(我们托管应用程序,它没有安装在客户站点上,所以这不是一个很大的问题)。
缺点
- 它要求我们今后使用的每个程序集都必须进行签名。
我的两个具体问题是:
1. 总的来说,您是否认为签名/强命名程序集是一个好主意?
2. 您能想到其他的优点或缺点吗?

1
一切必须现在都签名的想法从何而来?未签名的程序集是具有传染性的:您无法从已签名的程序集引用未签名的程序集。但反过来是可以的。必须签名的那些程序集是由于您在第一段中概述的原因。 - R. Martinho Fernandes
顺便说一句:它不能阻止篡改。你可以剥离SN,更改引用程序集,然后就可以继续了。我使用Reflector和Reflexil在一些商业软件上进行了概念验证。 - kͩeͣmͮpͥ ͩ
@David:你甚至可以只用ilasm和ildasm来完成它。@未来的David:谢谢,我已经调整了有符号/无符号的顺序。 - R. Martinho Fernandes
@Martino,我认为你把最后一部分搞混了——你不能从已签名的程序集引用未签名的程序集,但是你可以从未签名的程序集引用已签名的程序集。 - kͩeͣmͮpͥ ͩ
我从未说过我们解决方案中的所有内容都必须签名。我的观点是,与其寻找哪些必须签名,不如直接将它们全部签名,这样更简单。这也可以避免未来出现的问题,例如开发人员将已签名项目的引用设置为未签名项目,突然间解决方案无法编译,因为现在我们必须签署新引用的项目并查找所有它所引用的东西以确保它们被签名。 - Craig W.
3个回答

5

你的单缺点是虚假的,实际上它是一个优点。

未签名程序集只能被未签名程序集使用。已签名程序集可以被已签名程序集和未签名程序集同时使用。


6
我认为这也是一个优点,但客观来看,这意味着我们从现在开始引入组织的任何软件(商业软件、开源软件、共享软件等)必须提供签名版本,或者我们必须能够使用自己的 snk 构建签名版本。我认为从企业的角度来看,这可能被视为一个缺点。 - Craig W.
1
@Craig:这是一个很好的观点。我在考虑有责任的供应商的理想情况 :(. 令人遗憾的是,并不是每个制作可重用软件的人都会在不加思索的情况下签署他们发布的内容:这是让所有客户满意的唯一途径。 - R. Martinho Fernandes

4

“从COM调用程序集是必需的”

您不需要对程序集进行签名即可使其成为COM组件。我实现了许多COM服务器而没有对程序集进行签名。

一些更多的缺点:

  • 如果要更新一个程序集的新版本,则需要替换所有其他需要该程序集的程序集 => 没有共享组件
  • 不能使用未签名的第三方组件(许多免费/开源)
  • 在GAC中签名的程序集不受验证,有人可能会更改/替换您的签名程序集,并且您的程序会欣然接受这个任何内容 链接

不正确。您必须在配置文件中添加绑定重定向行以更新程序集。这可能仍然是一个问题,但不是灾难性的。 - jbtule
1
你必须将它添加到使用该组件的每个应用程序中。如果你有 app->module->component 并且你更新了该组件,那么应用程序必须为甚至不知道的组件添加重定向是不容易的。这是实用 DLLs 被集成在模块中的常见情况。 - Firo
你不能更新一个程序集到新版本而不替换所有需要它的其他程序集。你应该告诉微软这个问题,因为他们已经这样做很长时间了。 - Voo
@Firo 确实如此。现在想想,使用 .NET 4.0 的 System.dll 编译的程序将在 .NET 4.6 上完美运行。"诀窍"在于只有在引入破坏性更改时才更新您的程序集版本,您仍然可以更新文件版本以区分不同的版本。哇,您可以轻松创建新版本,就像没有签名一样,并且您还可以确保某人不使用实际上与二进制不兼容的新版本。 - Voo
此外,你的“恶意攻击链接”需要攻击者已经拥有管理员权限。如果你邪恶的攻击的第一步需要获取管理员权限,那不是漏洞利用,那是社交工程,而且真的没有技术解决方案。 - Voo
显示剩余5条评论

3
  • ClickOnce要求您的程序集必须签名
  • 许多开源项目不提供签名的程序集,并且使用自己的SNK编译通常是不容易的

感谢大家对此的反馈,我们将把所有内容合并为一个答案。 - kͩeͣmͮpͥ ͩ
对于非签名分发的提及加一分。当你必须安装一些东西才能运行开源项目的构建脚本时,这是一件麻烦事,因为开发人员听到了有关程序集签名的虚假信息并感到害怕。 - R. Martinho Fernandes
我们已经考虑了开源问题。我们公司不愿意采用开源解决方案,而我们使用的少数几个要么提供了签名程序集,要么非常容易构建签名版本。 - Craig W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接