163

.snk 文件有什么用?我知道它代表Strongly Named Key,但是关于它是什么以及它是如何工作的所有解释都超出了我的想象。

关于如何使用强命名密钥及其工作原理是否有任何简单的解释?

4

5 回答 5

219

.snk 文件用于将强名称应用于 .NET 程序集。这样一个强大的名字包括

一个简单的文本名称、版本号和文化信息(如果提供)——加上一个公钥和一个数字签名。

SNK 包含一个唯一的密钥对 - 一个私钥和公钥,可用于确保您拥有程序集的唯一强名称。当程序集被强命名时,会根据程序集的内容构造一个“哈希”,并使用私钥对哈希进行加密。然后将此签名的哈希与 .snk 中的公钥一起放入程序集中。

稍后,当有人需要验证强命名程序集的完整性时,他们构建程序集内容的哈希,并使用程序集的公钥解密程序集附带的哈希 - 如果两个哈希匹配,装配验证通过。

能够以这种方式验证程序集以确保没有人将程序集换成会破坏整个应用程序的恶意程序集,这一点很重要。这就是为什么非强命名程序集不像强命名程序集那样受信任,因此它们不能放在 GAC 中。此外,还有一个信任链——您不能生成引用非强命名程序集的强命名程序集。

文章“强命名的秘密(存档于 Wayback Machine) ”。在更详细地解释这些概念方面做得很好。带图片。

于 2008-09-25T02:42:34.943 回答
22

在.Net 世界中,SNK文件用于对已编译的二进制文件进行签名。这允许发生一些事情:

  1. 您可以在 GAC (全局程序集缓存)中注册程序集。基本上这样您就可以从同一台机器上的许多地方引用它,而无需维护多个副本)。
  2. 您可以在其他也已签名的二进制文件中使用您的二进制文件(对于已签名的程序集,这是一种奇怪的病毒式行为)。
  3. 无权访问 SNK 文件的第 3 方不能(轻松)修改您的程序集,至少提供少量安全性。

我不熟悉BizTalk 服务器的工作原理,因此我认为我无法清楚地说明它们在该环境中的具体用途。

希望这有点帮助。

于 2008-09-25T02:49:48.593 回答
7

.snk 文件用于对程序集进行签名,以便能够将它们添加到全局程序集缓存 (GAC)。

.snk 文件包含您的密钥的公共和私有令牌。当您想使用该密钥对某些数据(或二进制文件)进行签名时,将对数据计算校验和,然后使用私有令牌对其进行加密。然后将加密的校验和添加到数据中。任何人都可以使用您的密钥中的公共令牌来解密校验和,并将其与他们计算的校验和进行比较,以验证签名数据没有被篡改。

您可以在http://en.wikipedia.org/wiki/Public-key_cryptography阅读有关公钥加密的更多信息。

于 2008-09-25T02:50:02.507 回答
4

.snk 文件是由框架实用程序集中的 sn 实用程序生成的“密钥”的持久版本。然后,您可以使用此文件对您的程序集进行“数字签名”。它是一个 2 部分密钥.. 私钥-公钥组合。密钥的公共部分是公开的,即每个人都知道。私有部分只有您(组件/应用程序开发人员)知道,并且打算保持这种方式。

当您签署您的程序集时,它使用您的程序集的私钥和散列值来创建嵌入在您的程序集中的数字签名。此后,任何加载您的程序集的人都会经过验证步骤。公钥用于验证程序集是否真的来自您。您只需要为此的公钥(它也嵌入在程序集清单中的标记化形式中)。如果程序集已被篡改,则哈希值将不同,程序集加载将被中止。这是一种安全机制。

于 2008-09-25T02:46:09.397 回答
3

.snk 文件用于确保其他人不能用自己的程序集代替您的程序集。它提供了一对加密/解密密钥。

当使用 .snk 文件对程序集进行签名时,会根据程序集文件计算哈希码值并使用私钥进行加密。然后将该加密的“摘要”与 .snk 文件中的公钥一起附加到程序集上。

然后,当有人收到您的程序集时,他们还可以计算该哈希码值。他们使用公钥解密您计算的密钥并比较计算的值。如果程序集完全被更改,这些值将不同,并且程序集的用户将知道您拥有的程序集不是您提供的程序集。

在 BizTalk Server 的上下文中,构建 BizTalk 解决方案使用的任何自定义程序集的人都需要使用 .snk 文件对程序集进行签名,以便 BizTalk 服务器可以将其加载到 GAC 中并使用它。

于 2008-09-25T02:59:38.773 回答