什么是.snk?

时间:2008-09-25 02:35:21

标签: .net strongname snk

什么是.snk文件?我知道它代表名字很强的密钥,但所有关于它是什么以及它是如何工作的解释都在我的头上。

是否有关于如何使用强名称密钥以及它如何工作的简单说明?

5 个答案:

答案 0 :(得分:206)

.snk文件用于应用strong name to a .NET assembly。这么强的名字由

组成
  

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

SNK包含一个唯一的密钥对 - 私钥和公钥,可用于确保您具有唯一的强名称。当程序集具有强名称时,将从程序集的内容构造“哈希”,并使用私钥加密哈希。然后,这个签名的哈希与.snk中的公钥一起放在程序集中。

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

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

文章“The Secrets of Strong Naming”。能够更好地解释这些概念。随着图片。

答案 1 :(得分:22)

  

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

  1. 您可以在GAC (全局程序集缓存)中注册程序集。基本上这样你就可以从同一台机器上的许多地方引用它,而不必维护多个副本。)
  2. 您可以在其他已签名的二进制文件中使用您的二进制文件(对于已签名的程序集,这是一种奇怪的病毒行为)。
  3. 无法(轻松)修改无法访问SNK文件的第三方您的程序集,至少提供少量安全保护。
  4. 我不熟悉 BizTalk服务器的工作原理,所以我认为我不能详细说明它们在该环境中的具体目的。

    希望这有点帮助。

答案 2 :(得分:7)

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

.snk文件包含密钥的公钥和私钥。如果要使用该密钥对某些数据(或二进制)进行签名,则会对数据计算校验和,然后使用私有令牌对其进行加密。然后将加密的校验和添加到数据中。任何人都可以使用密钥中的公共令牌来解密校验和,并将其与计算出的校验和进行比较,以验证签名数据是否未被篡改。

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:3)

.snk文件用于确保其他人无法在您的地方放置自己的程序集。它提供了一对加密/解密密钥。

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

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

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