27

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

来自维基百科文章“程序集(CLI)”

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

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

4

3 回答 3

52

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

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

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

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

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

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

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

明白了吗?

(好问题;这将在 9 月 3 日出现在我的博客上。)

于 2009-08-26T16:45:01.230 回答
3

正如您在上一个相关问题中所读到的,避免篡改强命名程序集并不像您期望的那样简单。

于 2009-08-26T13:29:48.540 回答
2

The digital signature is essentially the bit that prevents tampering. Once the assembly is signed, then any changes to will invalidate the signature and the clr will know not to load it.

Read the wikipedia article. Digital signatures prevent tampering of any digital document. Not just assemblies. It explains it way better then I ever could.

于 2009-08-26T13:24:23.213 回答