.snk的作用是什么?

时间:2020-03-06 14:42:07  来源:igfitidea点击:

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

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

解决方案

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

a simple text name, version number,
  and culture information (if
  provided)—plus a public key and a
  digital signature.

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

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

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

文章"强命名的秘密"。在详细解释这些概念方面做得非常出色。带图片。

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

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

In a the.Net world the SNK file is used to sign your compiled binaries.
  This allows a couple things to happen:
  • 我们可以在GAC(全局程序集缓存)中注册程序集。基本上,因此我们可以在同一台计算机上的许多地方引用它,而不必维护多个副本。
  • 我们可以从也已签名的其他二进制文件中使用二进制文件(对于已签名的程序集,这是一种奇怪的病毒式行为)。
  • 无法访问SNK文件的第三方无法(轻松)修改程序集,从而至少提供了少量安全性。

我不熟悉BizTalk Server的工作方式,因此我认为我不能对BizTalk Server在该环境中服务的特定目的有多大的了解。

希望这会有所帮助。

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

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

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

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

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

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

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