9

好的,我一定很笨,因为我已经读过这个: http ://www.csharp411.com/net-assembly-faq-part-3-strong-names-and-signing/

而且我还是不明白...

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

私钥呢?不应该是私有的,而我,开发者,是唯一拥有它的人吗?程序集不应该只用公钥签名吗?

谁能给我解释一下?基本上,我想签署我的项目程序集并允许我的用户检查程序集是否真的由我开发,而我是唯一保留私钥的人(我认为我应该这样做)。

4

4 回答 4

8

你基本上是对的。

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

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

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

整个事情的可靠程度取决于您将密钥文件保密的能力。

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

于 2009-07-31T20:37:18.013 回答
4

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

于 2009-07-31T20:47:05.527 回答
2

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

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

于 2009-07-31T20:40:12.717 回答
1

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

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

PublicKey 令牌 = PublicKey 的 SHA1 哈希的最后 64 位,采用 little-endian 字节顺序。

于 2011-07-08T22:20:27.067 回答