增强型强名称 (SNK) 和个人交换格式 (PFX) 之间有什么区别,应在何时使用?

What is the difference between Enhanced Strong Name (SNK) and Personal Exchange Format (PFX) and when should each be used?

此问题是以下问题的延伸:

我正在查看自定义程序集的强命名及其代码签名,并阅读了各种 SO 帖子(见上文)和 MSDN。我了解以下内容:

  1. 强命名程序集无需密码 创建一个 SNK 文件并仅标识程序集的发布者,以便它可以部署到 GAC 并减轻所谓的 DLL Hell 由来自不同出版商的同名程序集引起。
  2. 强命名程序集使用密码 将代码签名添加到程序集并创建 PFX 文件,而不是 SNK 文件。这既可以识别发布者,也可以验证代码未被篡改。注意:此文件可以由 Verisign 和 Digicert 等受信任的证书颁发机构创建并导入,也可以是在组织内创建的自签名证书。自行创建 PFX 与创建强命名程序集的步骤相同,但您只需为其添加密码。
  3. 增强型强命名对我来说似乎有点神秘。它涉及创建一个强命名的 SNK 文件(即无密码),然后从中提取私钥。它似乎只是为了允许从已弃用的哈希算法迁移。

我理解2是1的逻辑扩展,我上面的理解对吗?但是,上面的2和3有什么区别呢? 3 是否比 1 有任何优势,还是它只是一种允许跨算法迁移的方法?换句话说,我想 2 和 3 的存在是出于不同的原因;那是什么reason/implementation?

对 1 的补充:您需要强命名以确保未引用任何未签名的程序集。您可能不想使用 GAC。

对 2 的更正:代码签名 != 强命名。对于强命名,请使用 sn.exe 创建密钥。对于代码签名,需要一个带有私钥的 x.509 数字证书。证书本身没有密码。 PFX/PKCS#12 容器格式使用密码来保护私钥。其他选项。像例如可以使用智能卡或令牌。

所以 2 不是 1 的扩展。3 的优点是使用更好的哈希算法和两个而不是一个签名。