强命名和数字签名都使用公钥加密来提供有关程序集来源的证据,以便您可以应用安全策略来确定授予程序集的权限。
它们的区别不在于技术细节,而在于它们打算解决的问题。
强名称的目的仅仅是确保当您按名称加载程序集时,您加载的正是您认为正在加载的程序集。这是强名称的唯一设计目的。你说“我想加载来自 FooCorp 的 Frobber 版本 4”。强大的名称 gear 可确保您实际加载准确的 DLL,而不是来自 Dr. Evil Enterprises 的另一个名为 Frobber 的程序集,版本 4。
为了实现这一点,您只需要知道与 FooCorp 的私钥关联的公钥令牌。你如何知道公钥令牌完全是你的事。没有旨在帮助您安全获取该信息的基础设施。你只是希望知道它是什么,不知何故。
来自发布者证书的数字签名的目的是建立可验证的身份和信任链。信任链从一大块未知或不确定来源的代码到“受信任的根”——您已将操作系统配置为信任的实体。您下载了一些代码,该代码具有带有 FooCorp 证书的数字签名。你检查证书,上面写着“这个程序来自 FooCorp。这个证书的准确性由 VeriSign 担保。” 由于 VeriSign 是您值得信赖的根源之一,您现在可以确信此代码确实来自 FooCorp。
请注意数字签名解决的问题要复杂得多。我们并不是要简单地确定“这块代码是否与这个名称相关联?” 相反,我们试图确定此代码来自何处,以及谁保证据称负责的公司的存在,我们应该信任该公司吗?
强名称和数字签名之间的区别强调了基于加密的安全性的难点。难题不在于密码学。那只是数学。困难的问题是安全地管理有关密钥的信息分发并将它们与正确的实体相关联。强名称,因为它们试图解决一个很小但很重要的问题,所以没有密钥管理问题。或者,更确切地说,他们将密钥管理问题强加给您,即用户。数字签名都是关于尝试通过证书自动安全分发关键信息,以解决更复杂的信任和身份问题。
明白了吗?
(好问题;这将在 9 月 3 日出现在我的博客上。)