什么是.snk文件?我知道它代表名字很强的密钥,但所有关于它是什么以及它是如何工作的解释都在我的头上。
是否有关于如何使用强名称密钥以及它如何工作的简单说明?
答案 0 :(得分:206)
.snk文件用于应用strong name to a .NET assembly。这么强的名字由
组成简单的文字名称,版本号, 和文化信息(如果 提供) - 一个公钥和一个 数字签名。
SNK包含一个唯一的密钥对 - 私钥和公钥,可用于确保您具有唯一的强名称。当程序集具有强名称时,将从程序集的内容构造“哈希”,并使用私钥加密哈希。然后,这个签名的哈希与.snk中的公钥一起放在程序集中。
稍后,当有人需要验证强名称程序集的完整性时,他们构建程序集内容的哈希值,并使用程序集中的公钥来解密来自哈希的哈希使用程序集 - 如果两个哈希匹配,则程序集验证通过。
能够以这种方式验证程序集非常重要,以确保没有人为一个会破坏整个应用程序的恶意程序交换程序集。这就是为什么非强名称程序集不像强名称程序集那样受信任的原因,因此它们不能放在GAC中。此外,还有一个信任链 - 您无法生成引用非强名称程序集的强名称程序集。
文章“The Secrets of Strong Naming”。能够更好地解释这些概念。随着图片。
答案 1 :(得分:22)
在.Net世界中, SNK 文件用于对已编译的二进制文件进行签名。 这允许一些事情发生:
我不熟悉 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并使用它。