签署.NET程序集

时间:2009-08-26 13:19:00

标签: c# .net assembly-signing

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

来自Wikipedia article "Assembly (CLI)"

  

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

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

5 个答案:

答案 0 :(得分:46)

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

他们的技术细节不同,而是他们打算解决的问题。

强名称的目的仅仅是为了确保在按名称加载程序集时,您正在加载您认为正在加载的程序集。这是强名称的唯一设计目的。你说“我想加载来自FooCorp的Frobber,版本4”。强名称齿轮确保您实际上正确加载该DLL,而不是另一个来自Evil Enterprises博士的名为Frobber,版本4的程序集。

为了实现这一点,所需要的只是您知道与FooCorp的私钥相关联的公钥令牌。您如何知道公钥令牌完全是您的业务。没有适合帮助您安全获取信息的基础设施。不知何故,你只是想知道它是什么。

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

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

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

这是清楚的吗?

(很棒的问题;这将在9月3日my blog上升。)

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

阅读维基百科文章。数字签名可防止篡改任何数字文档。不只是装配。它解释它比我做得更好。

答案 3 :(得分:2)

这篇Strong Naming vs Digital Signatures博客文章很好地解释了这一点。

答案 4 :(得分:1)

我找到了一个有趣的解释here。在这里张贴纸质文件。希望它可以帮到某人。