【问题标题】:Signing of .NET Assemblies.NET 程序集的签名
【发布时间】:2009-08-26 13:18:59
【问题描述】:

数字签名与强命名程序集有什么关系。我读到一个强命名的程序集有公钥和数字签名。

来自Wikipedia article "Assembly (CLI)"

“对程序集进行签名涉及获取程序集重要部分的哈希,然后用私钥加密哈希。签名的哈希与公钥一起存储在程序集中。公钥将解密签名的哈希。当 CLR 加载一个强命名程序集时,它将从程序集生成一个哈希,然后将其与解密的哈希进行比较。如果比较成功,则意味着文件中的公钥(以及公钥令牌)与用于签署程序集的私钥。这意味着程序集中的公钥是程序集发布者的公钥,因此可以阻止欺骗攻击。"

以上信息准确吗?它没有任何对数字签名的引用。我找不到 MSDN 页面来解释程序集如何签名、签名如何验证以及如何消除黑客攻击的可能性。我想了解更多关于这些的信息。

【问题讨论】:

  • 你问的很多。这是一个复杂的主题,您似乎有兴趣从头到尾了解它的工作原理。
  • 我想大致了解一下它是如何工作的。
  • 我发现了一个有趣的解释here。在这里张贴纸迹。希望它可以帮助某人。

标签: c# .net assembly-signing


【解决方案1】:

强命名和数字签名都使用公钥加密来提供关于程序集来源证据,以便您可以应用安全政策,以确定授予程序集权限

它们的区别不在于技术细节,而在于它们打算解决的问题。

强名称的目的仅仅是为了确保当您按名称加载程序集时,您加载的正是您认为正在加载的程序集。这是强名称的唯一设计目的。你说“我想加载来自 FooCorp 的 Frobber 版本 4”。强大的名称 gear 可确保您实际加载精确的 DLL,而不是来自 Dr. Evil Enterprises 的另一个名为 Frobber 的程序集,版本 4。

为了实现这一点,您只需知道与 FooCorp 的私钥关联的公钥令牌。你如何知道公钥令牌完全是你的事。没有旨在帮助您安全获取该信息的基础设施。你只是应该知道它是什么,不知何故。

发布者证书的数字签名的目的是建立可验证的身份和信任链。信任链从大量未知或不确定来源的代码到“受信任的根”——您已将操作系统配置为信任的实体。您下载了一些代码,该代码具有带有 FooCorp 证书的数字签名。您检查证书并显示“该程序来自 FooCorp。该证书的准确性由 VeriSign 担保。”由于 VeriSign 是您值得信赖的根源之一,您现在可以确信此代码确实来自 FooCorp。

请注意数字签名解决的问题要复杂得多。我们并不是要简单地确定“这块代码是否与这个名称相关联?”相反,我们试图确定此代码来自哪里,以及由谁来保证涉嫌负责的公司的存在,我们应该信任该公司吗?

强名称和数字签名之间的区别强调了基于加密的安全性的难点。难题不在于密码学。那只是数学。难题是安全地管理密钥信息的分发并将它们与正确的实体相关联。强名称,因为它们试图解决一个很小但很重要的问题,所以没有密钥管理问题。或者,更确切地说,他们将密钥管理问题强加给您,即用户。数字签名旨在尝试通过证书自动安全地分发密钥信息,以解决更复杂的信任和身份问题。

清楚吗?

(好问题;这个问题将于 9 月 3 日在my blog 提出。)

【讨论】:

    【解决方案2】:

    正如您在此 previous related question 中所读到的,避免篡改强命名程序集并不像您想象的那么简单。

    【讨论】:

      【解决方案3】:

      digital signature 本质上是防止篡改的位。对程序集签名后,对 的任何更改都会使签名无效,并且 clr 将知道不加载它。

      阅读维基百科文章。数字签名可防止篡改任何数字文档。不仅仅是组件。它解释得比以往任何时候都好。

      【讨论】:

        猜你喜欢
        • 2015-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 2023-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多