.snk是用于什么的?

172

.snk文件是用来做什么的?我知道它代表着Strongly Named Key(强命名密钥),但所有关于它究竟是什么和如何工作的解释都让我无法理解。

有没有简单易懂的解释关于强命名密钥的使用和工作原理?

5个回答

227
.snk文件用于为.NET程序集应用强名称。这种强名称包含简单的文本名称、版本号和区域信息(如果提供),加上公钥和数字签名。
SNK包含一个唯一的密钥对——私钥和公钥,可用于确保您为程序集拥有唯一的强名称。当程序集被强命名时,从程序集内容构建出一个“哈希”,并使用私钥对哈希进行加密。然后将此已签名哈希与.snk中的公钥一起放置在程序集中。
稍后,当某人需要验证强命名程序集的完整性时,他们会生成程序集内容的哈希,并使用程序集中的公钥来解密伴随程序集的哈希。如果两个哈希匹配,则程序集验证通过。
以这种方式能够验证程序集的重要性在于确保没有人将程序集替换为恶意程序集,以破坏整个应用程序。这就是为什么非强命名程序集不会像强命名程序集那样受到信任,因此它们不能放置在全局程序集缓存中。此外,还有一条信任链——无法生成引用非强命名程序集的强命名程序集。

文章 "The Secrets of Strong Naming (存档于 Wayback Machine)" 很好地解释了这些概念,附有图片。


3
这是否意味着当您使用 .PFX 对程序集进行签名时,实际上它只是在编译时动态生成一个 .SNK 文件? - Patrick
5
不,那是“Authenticode Signature”(数字签名),虽然它也能证明文件在签名和检查之间没有被修改,但它不能满足强名称的要求。问题在于,Authenticode不要求强名称所需的程序集信任链,因此您可以对依赖非强命名/签名程序集的程序集进行Authenticode签名。 - Scott Chamberlain
1
你可以简单地剥离 snk 并替换为另一个..我不知道真正有用的场景..它基本上是我们的密钥对,你不能建立信任。 - Ibrahim
9
WayBackMachine 链接:强名称的秘密 - adyavanapalli
请更新答案中的链接(更换为@asfeynman建议的链接),因为原链接已失效,而且并不是每个人都会阅读评论。 - XelaNimed

25
在.Net世界中,SNK文件用于签名已编译的二进制文件。这样做可以实现以下几点:
  1. 您可以在全局程序集缓存(GAC)中注册程序集,这样您就可以在同一台计算机上的多个位置引用它而无需维护多个副本。
  2. 您可以从其他已签名的二进制文件中使用您的二进制文件(这是一种奇怪的病毒式行为)。
  3. 只有拥有SNK文件访问权限的第三方才能轻松修改您的程序集,提供至少一定程度的安全性。
我不熟悉BizTalk服务器的工作原理,因此我想我无法说明它们在该环境中的具体用途。希望这对您有所帮助。

8

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

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

您可以在 http://en.wikipedia.org/wiki/Public-key_cryptography 上了解更多关于公钥密码学的内容。


4
一个 .snk 文件是由框架实用程序集中的 sn 实用程序生成的您的“密钥”的持久化版本。然后,您可以使用此文件来“数字签名”您的程序集。它是一个由私有-公共密钥组合而成的双重密钥。密钥的公共部分已发布,即为众所周知。私钥只有您,组件/应用程序开发人员才知道,并且应该保持这种状态。
当您签署程序集时,它使用私钥和程序集的哈希值创建数字签名,该数字签名嵌入在程序集中。此后,加载程序集的任何人都需要进行验证步骤。公钥用于验证程序集是否真的来自您,您只需要使用公钥(也以令牌化形式嵌入在程序集清单中)进行验证。如果程序集被篡改,则哈希值将不同,并且程序集加载将被中止。这是一种安全机制。

3
一个 .snk 文件用于确保别人不能将自己的程序集代替你的程序集。它提供了一对加密/解密密钥。
当一个 .snk 文件用于签名一个程序集时,会从程序集文件中计算出哈希码值,并使用私钥进行加密。然后将该加密的“摘要”与来自 .snk 文件的公钥一起添加到程序集中。
然后当有人接收到你的程序集时,他们也可以计算出那个哈希码值。他们使用公钥来解密你计算出来的那个值并比较计算出的值。如果程序集被更改过,这些值将不同,程序集的用户就会知道你提供的程序集不是原来的那个。
在 BizTalk Server 的上下文中,任何构建你的 BizTalk 解决方案所使用的自定义程序集的人都需要使用 .snk 文件来签名程序集,以便 BizTalk 服务器可以将其加载到 GAC 中并使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接