我似乎无法理解这个.NET程序集签名的事情

时间:2009-07-31 20:30:27

标签: .net assemblies signing strongname

好吧,我必须愚蠢,因为我已经读过这个: http://www.csharp411.com/net-assembly-faq-part-3-strong-names-and-signing/

我仍然没有得到它......

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

私钥怎么样?不应该是私人和我,开发人员,是唯一拥有它的人吗?组件不应仅使用公钥签名吗?

任何人都可以向我解释这个吗?基本上,我想签署我的项目的程序集,并允许我用户检查程序集是否真的由我开发,我只保留私钥(我认为我应该)。

4 个答案:

答案 0 :(得分:8)

你基本上是对的。

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

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

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

整个事情只能保持密钥文件的私密性。

另请注意,理想情况下,每家公司只能拥有1个密钥。如果您担心与(很多)同事共享,请调查延迟签名。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

程序集签名基于public-key cryptogrpahy(PKI)。简而言之,一般概念是当您使用PKI对某些内容进行加密签名时,私钥用于进行签名,但公钥用于验证签名。私钥不能用于验证签名,只能创建它。公钥不能用于创建签名,只能验证它。

鉴于此,保持私钥安全和私密非常重要。如果您希望保持最高级别的安全性并为您的客户提供最高级别的真实性,那么最好使用延迟签名,并让一个人或部门负责管理您的完整公钥/私钥对。开发人员不应该访问私钥,并且可以使用延迟签名选项来开发强名称的程序集,而不会影响安全性和真实性。

答案 3 :(得分:1)

签名=使用私钥加密程序集的SHA1哈希
验证=将PublicKey-Decrypted签名与程序集的计算散列进行比较

因此,任何拥有PublicKey的人都可以验证程序集,但只有具有PrivateKey的Author才能签署程序集。

PublicKey令牌=以小端字节顺序的PublicKey的SHA1哈希的最后64位。