代码之家  ›  专栏  ›  技术社区  ›  user200783

.NET:可执行文件是否应该具有强名称签名?私人DLL呢?

  •  26
  • user200783  · 技术社区  · 16 年前

    我的应用程序由三个程序集组成:一个引用两个DLL的EXE。DLL对我的应用程序是私有的-它们仅由此可执行文件使用。

    是否应为这些程序集指定一个强名称?

    FxCop建议,对于它当前生成的所有程序集,它们应该:

    然而, this advice

    通常,应避免对应用程序EXE程序集进行强命名。

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

    编辑:

    Paint.NET Crack.NET 不是强名称,而 .NET Reflector Snoop

    有趣的是,对于Expression suite,Microsoft采取了后一种方法:例如,在Expression Blend中,他们选择对Blend.exe和附带的dll(如Microsoft.Expression.Blend.dll)进行强名称签名。

    对于我的第一个问题,我似乎不太可能得到一个简单的答案:“我应该给这些程序集起一个强有力的名字吗?”。不过,我的第二个问题仍然存在:

    编辑2:

    如果没有压倒性的理由,我倾向于给我的集会起一个强有力的名字。因此,我很感兴趣的是,是否有人可以在此基础上进行扩展(从第一个链接开始):

    4 回复  |  直到 16 年前
        1
  •  16
  •   user200783    16 年前

    在我看来,在这种情况下,强名称签名有以下好处:

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

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

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

        2
  •  5
  •   Community Mohan Dere    10 年前

    强命名程序集只能确保版本兼容性。这与信任程序集不同。

    换句话说,“强名称”仅指编译时使用的确切程序集二进制文件和版本号。

    如果对这些程序集进行GAC,CLR将只验证一次。在大会是gac的时候。这可以提高性能。然而,我的经验表明这是微不足道的。

    强名称程序集可以替换为非强名称程序集;这就引出了关于强命名不是任何类型的安全特性的部分。

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

        3
  •  4
  •   Michael Damatov    16 年前

    对程序集进行签名可确保编译后不会修改程序集。只要您是唯一的私钥所有者,就没有人能够使用您的密钥退出程序集。

    当然,这不是绝对的保护。黑客可以修改程序集并从所有程序集中删除强名称签名(和引用)。这些组件也可以工作。

    但是在这种情况下,你可以说这些修改不是你做的。

        4
  •  1
  •   Sky Sanders    16 年前

    如果对程序集进行签名,则任何引用的程序集都将公开,并且必须对其进行签名。否则,您将有一个编译错误。

    我认为对程序集进行强命名的主要用途是将其放入GAC中。

    我认为没有必要对exe进行强名称。

    就我的2比索。。。。

    推荐文章