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

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

问题描述:

好了,我一定是愚蠢的,因为我已经阅读过这一点: http://www.csharp411.com/net-assembly-faq-part-3-strong-names-and-signing/我似乎无法理解这个.NET程序集签名的事情

我仍然不明白这一点...

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

私钥怎么样?不应该是私人的,我是开发者,是唯一拥有它的人吗?不应该只使用公钥对程序集进行签名吗?

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

你基本上是对的。

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

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

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

而且整个事情只有像保持密钥文件私密的能力一样可靠。

另请注意,理想情况下,您应该每个公司只有1个关键。如果您担心与(许多)同事分享,请调查延迟签名。

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

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

+0

实际上,公钥/私钥的使用是非常对称的。正常编码(不签名)使用公钥。 – 2009-07-31 20:43:03

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

签名=加密使用私钥
验证大会的SHA1哈希=比较大会所计算的散列的公钥解密签名

因此,任何以公钥可以验证的组件,但只有使用PrivateKey的作者可以签署一个程序集。

PublicKey token =以小端字节顺序排列的PublicKey的SHA1散列的最后64位。