.NET:可执行文件应该是强名称签名吗?私有DLL怎么样?

use*_*783 28 .net strongname assemblies

我的应用程序包含三个程序集:一个引用几个DLL的EXE.DLL对我的应用程序是私有的 - 它们仅由此可执行文件使用.

这些集会是否应该有一个强有力的名字?

FxCop建议他们应该 - 对于它目前生成的所有程序集:

CA2210:使用强名称密钥对<assembly>进行签名.

但是,这个建议说:

通常,您应该避免强命名应用程序EXE程序集.

您可能希望避免使用应用程序专用的强命名组件.

我应该给这些集会一个强有力的名字吗?在这种情况下这样做(或不这样做)有什么好处?

编辑:

看几个具有类似结构的应用程序,似乎没有就此问题达成共识.Paint.NETCrack.NET的二进制文件没有强名称,而.NET ReflectorSnoop的二进制文件则没有.

有趣的是,使用Expression套件,Microsoft采用了后一种方法:例如,在Expression Blend中,他们选择对Blend.exe和随附的DLL(例如Microsoft.Expression.Blend.dll)进行强名称签名.

似乎我不太可能得到第一个问题的简单答案:"我应该给这些集会一个强有力的名字吗?".但是,我的第二个问题仍然存在:

在这种情况下,强名称签名二进制文件是否有任何好处?或者,不这样做会有什么好处吗?

编辑2:

如果无论如何都没有压倒性的理由,我倾向于给我的集会一个强有力的名字.因此,我对是否有人可以扩展(从第一个链接)感兴趣:

"强命名可能会使管理依赖项变得更加困难,并为私有组件增加不必要的开销."

use*_*783 16

在我看来,这些是在这种情况下强名签名的好处:

  • 防止攻击者将DLL替换为使用另一个密钥(或根本不签名)签名的DLL,而不替换EXE(因为EXE包含包含公钥的引用).
  • 防止攻击者在保留现有密钥的同时修改程序集(因为这会导致签名验证失败).但请注意,从.NET 3.5 SP1开始,默认情况下会禁用此情况下的签名验证.
  • 可以防止应用程序与不匹配的程序集版本一起运行 - 如果由于部署错误而错误地替换了DLL,则应用程序将无法加载它而不是尝试使用(可能不兼容的)错误版本.
  • 避免FxCop警告.

签名的缺点(我相信这些是链接文章所指的):

  • 用兼容的新版本替换DLL(例如,为了修复错误)需要替换EXE.
  • 在.NET版本<3.5 SP1中,由于签名验证,强名称程序集需要更长时间才能加载.
  • 强命名的DLL也需要更长的时间来加载,因为加载程序在查找本地之前执行(在这种情况下是徒劳的)搜索GAC.

这种选择要么是强命名(因此需要引用匹配精确密钥和精确版本),要么不强命名(并且不需要匹配),这似乎是一种耻辱.如果可能需要密钥而不是特定版本,也许可以获得签名的前2个好处,而不会产生第一个缺点.也许这可以通过应用强名称然后使用app.config处理版本控制问题来实现?


Not*_*tMe 5

强命名程序集仅用于确保版本兼容性.这与信任程序集不同.

换句话说,"强名称"仅指精确汇编二进制文件与编译时使用的版本号相结合.

如果你GAC那些程序集,那么CLR只会验证一次.当组装是gac'd时.这可以带来性能提升.但是,我的经验表明它很小.

强名称程序集可以替换为不具有强名称的程序集; 这提出了关于强命名的部分,而不是任何类型的安全功能.

我个人认为,与他们相关的疼痛程度并不能证明他们的使用是正确的.痛苦是他们如何使用自动化测试工具.

https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5054496.html

  • @Paul:您无法检测强名称程序集.检测涉及修改程序集以在方法周围插入必要的跟踪代码.但是,有强名称可以防止修改...... (2认同)