c# - .NET 程序集的签名

标签 c# .net assembly-signing

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

来自Wikipedia article "Assembly (CLI)" :

"Signing the assembly involves taking a hash of important parts of the assembly and then encrypting the hash with the private key. The signed hash is stored in the assembly along with the public key. The public key will decrypt the signed hash. When the CLR loads a strongly named assembly it will generate a hash from the assembly and then compare this with the decrypted hash. If the comparison succeeds then it means that the public key in the file (and hence the public key token) is associated with the private key used to sign the assembly. This will mean that the public key in the assembly is the public key of the assembly publisher and hence a spoofing attack is thwarted."

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

最佳答案

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

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

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

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

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

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

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

清楚了吗?

(好问题;这将在 9 月 3 日的 my blog 上发布。)

关于c# - .NET 程序集的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1334631/

相关文章:

c# - 我可以/应该在客户端和 Web API 之间共享模型类吗?

c# - 使用 System.Runtime.Serialization.Json 反序列化 JSON

c# - 您如何获得 IsolatedStorage 中所有文件的平面列表?

c# - 检查对象是否为 null 并在同一个 if 语句中比较对象的属性值是否安全?

c++ - 为什么我的 C++ 程序集没有签名?

c# - 使用强名称签署程序集,好的,但是如果某些第 3 方 DLL 未签署怎么办?

c# - 如何以编程方式验证程序集是否使用特定证书签名?

c# - 将 RadioButtons 绑定(bind)到单个属性?

c# - 如何从后面的 c# 代码打开 jQuery UI 对话框?

c# - 系统.UnauthorizedAccessException : Retrieving the COM class factory for Word Interop fails with error 80070005