我似乎无法理解这个.NET程序集签名的东西。

9

好的,我必须有点笨,因为我已经阅读了这篇文章:http://www.csharp411.com/net-assembly-faq-part-3-strong-names-and-signing/,但我仍然不明白...

假设我打开我的项目属性并转到“签名”选项卡,然后选中“签署程序集”并生成一个带密码的新程序集。一个带有.pfx扩展名的强名称密钥文件,其中包含公钥和私钥,将被创建,并且VS将在编译时对我的程序集进行数字签名,对吗?

那么私钥呢?它不应该是私有的,只有我作为开发人员才能拥有它吗?程序集不应该只用公钥签名吗?

有人能向我解释一下吗?基本上,我想签署我的项目程序集,并允许我的用户检查程序集是否真的由我开发(我认为我应该是唯一拥有私钥的人)。

4个回答

8

你的理解基本上是正确的。

你需要创建一个密钥对并将其用于签名。但不要发布pfx(或snk)文件,它包含公钥和私钥,应该保持安全。

公钥作为签名过程的一部分添加到程序集中。

当程序集加载到应用程序中时,会检查此签名。最终用户也可以在GAC中检查公钥令牌,但这并不是一个方便的过程。而且你必须以某种方式告诉他们你的公钥令牌。

整个过程只有你能够保护密钥文件的私密性才能可靠。

还要注意的是,理想情况下,每个公司应该只有一个密钥。如果你担心与(许多)同事共享它,请研究延迟签名。


4
数字签名涉及计算二进制文件的哈希值,并使用您生成的密钥对中的私钥加密生成的哈希值。除此之外,VS还会将公钥添加到程序集中。现在当客户端执行此操作时,运行时将使用程序集中的公钥来解密签名(哈希值),然后将其与客户端上的二进制文件的计算哈希值进行匹配。如果它们匹配,则意味着二进制文件没有被篡改。

2
汇编签名基于公钥密码学(PKI)。简而言之,当您使用PKI对某物进行加密签名时,私钥用于签名,但公钥用于验证签名。私钥无法用于验证签名,只能用于创建签名。公钥无法用于创建签名,只能用于验证签名。
因此,保护好私钥非常重要。如果您希望维护最高的安全级别并向客户提供最高级别的真实性,最好使用延迟签名,并由单个个人或部门负责管理您的完整公钥/私钥对。开发人员不应访问私钥,可以使用延迟签名选项来仍然开发具有强命名程序集的同时也不会影响安全和真实性。

实际上,公钥/私钥的使用是相当对称的。普通编码(非签名)使用公钥。 - H H
@Henk:如果你在谈论加密,是的,公钥用于加密,私钥用于解密。在签名范围内,情况则相反。我不确定为什么你会称其为对称的...使用一个密钥进行加密/签名和另一个密钥进行解密/验证的整个概念是相当不对称的。 - jrista
签名实际上是加密的反向操作,这是对称部分。但你说得对,它被称为非对称加密。 - H H

1

签名 = 使用私钥加密程序集的SHA1哈希值
验证 = 将公钥解密的签名与程序集的计算哈希值进行比较

因此,任何人都可以使用公钥验证程序集,但只有作者才能使用私钥签署程序集。

PublicKey token = 公钥的SHA1哈希值的后64位(以小端字节顺序)。


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