数字签名与强命名程序集有什么关系?

27
数字签名与强命名程序集有什么关系?我读到说强命名程序集带有公钥和数字签名。
根据维基百科上的《程序集(CLI)》文章:
“对程序集进行签名涉及对程序集的重要部分进行哈希运算,然后用私钥对哈希值进行加密。签名后的哈希值与公钥一起存储在程序集中。公钥将解密签名后的哈希值。当CLR加载一个强命名程序集时,它会从程序集生成一个哈希值,然后将其与解密后的哈希值进行比较。如果比较成功,意味着文件中的公钥(因此也是公钥标记)与用于签名程序集的私钥相关联。这意味着程序集中的公钥是程序集发布者的公钥,从而阻止了伪造攻击。”
上述信息准确吗?它没有提到数字签名。我找不到一个解释程序集如何签名、如何验证签名以及如何消除黑客攻击可能性的MSDN页面。我想了解更多关于这些方面的信息,希望能对其整体工作原理有一个大致的了解。

你提出了很多问题。这是一个复杂的主题,而且你似乎有兴趣从头到尾学习它的工作原理。 - user1228
1
我想要一个整体的了解它是如何工作的。 - softwarematter
我在这里找到了一个有趣的解释:http://www.grimes.demon.co.uk/workshops/fusionWSCrackOne.htm。 在此发布以备查阅,希望能对某人有所帮助。 - softwarematter
3个回答

53
强名称数字签名都使用公钥加密来提供有关程序集的来源证据,以便您可以应用安全策略来确定授予程序集哪些权限
它们在技术细节上并没有区别,但是它们旨在解决不同的问题。
强名称的目的仅在于确保当您按名称加载程序集时,您正在加载确切的程序集。这是强名称的唯一设计目的。您说“我想加载来自FooCorp的版本为4的Frobber”。强名称机制确保您实际上加载了那个DLL,而不是另一个名为Frobber、版本为4、来自Dr. Evil Enterprises的程序集。
为了实现这一点,你只需要知道与FooCorp的私钥相关联的公钥标记。您如何获得该公钥标记完全由您自己决定。没有任何基础设施旨在帮助您安全地获取这些信息。您只需要知道它是什么,以某种方式获得它即可。
数字签名从发布者证书的角度来看,其目的是为了建立可验证的身份和信任链。信任链从一个未知或不确定来源的代码块开始,一直到“受信任的根”——您已经配置操作系统以信任该实体为止。您下载一些代码,而该代码具有来自FooCorp的证书的数字签名。您检查证书,它说“此程序来自FooCorp。VeriSign为此证书的准确性提供担保。”由于VeriSign是您信任的根之一,因此您现在有信心这个代码确实来自FooCorp。
请注意,数字签名解决的问题要复杂得多。我们不仅仅是试图确定“这个代码块是否与这个名称相关联?”相反,我们试图确定这个代码来自哪里,谁为据称负责的公司存在提供担保,并且我们应该信任该公司吗?
强名称和数字签名之间的差异强调了基于加密的安全性所困难的问题。难点并不在于密码学;那只是数学。难点在于安全地管理与正确实体关联的密钥信息的分发。强名称因为试图解决一个非常小但重要的问题,所以没有密钥管理问题。或者说,它们将密钥管理问题交给了您,用户。数字签名都是关于尝试通过证书自动安全地分发密钥信息,以解决更复杂的信任和身份问题。
清楚吗?

很好的问题;这将在我的博客上于9月3日发布。


3

正如您可以在这个之前相关的问题中所读到的那样,避免篡改强名称程序集并不像您想象的那么简单。


2
数字签名本质上是防止篡改的位。一旦程序集被签名,任何更改都将使签名无效,CLR 将不会加载它。
请阅读维基百科文章。数字签名可以防止任何数字文档的篡改,不仅仅是程序集。它比我能做的解释得更好。

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