.snk的作用是什么?


153

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

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

Answers:


212

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

简单的文本名称,版本号和区域性信息(如果提供),再加上公共密钥和数字签名。

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

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

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

文章“ 强命名的秘密 ”。在详细解释这些概念方面做得很好。带图片。


2
这是否意味着当您使用.PFX签名程序集时,它实际上只是在编译时即时使用它来动态生成.SNK?
帕特里克

5
@Patrick不,这是Authenticode签名,尽管它还证明文件未在签名和检查之间进行修改,但不能满足强名称要求。问题是Authenticode不需要强命名所需的程序集的信任链,因此您可以Authenticode对依赖于非强命名/签名程序集的程序集进行签名。
Scott Chamberlain

1
您可以简单地剥离snk并将其替换为另一个。.我不知道在哪种实际情况下它是有用的..基本上这是我们的密钥对,您无法在此基础上建立信任
Ibrahim

8
WayBackMachine链接到“强名称的秘密”
asfeynman

请更新答案中的链接(至@asfeynman建议的链接),因为该链接已失效,并非所有人都阅读注释。
XelaNimed

22

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

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

我不熟悉BizTalk服务器的工作方式,所以我认为我不能对它们在该环境中服务的特定目的有太多了解。

希望这有所帮助。


7

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

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

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


4

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

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


3

.snk文件用于确保其他人无法代替自己的装配体。它提供了一对加密/解密密钥。

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.