【问题标题】:What is the difference between PublicKeyToken and public key?PublicKeyToken 和公钥有什么区别?
【发布时间】:2011-03-30 12:58:22
【问题描述】:

每个签名的 .NET 都有一个公钥令牌(8 个字节)和一个公钥(128 个字节)。 两者有什么区别,为什么我们需要两个公共“密钥”?

【问题讨论】:

    标签: .net security signature


    【解决方案1】:

    公钥令牌只是公钥的散列。这里是info


    更新

    为什么我们需要公钥?

    由于程序集可以被签名并且签名的程序集将包含公钥。加载 DLL 时,.NET 将使用公钥来根据签名验证程序集。签名只能使用私钥生成,而公钥本身可用于验证签名。

    此过程可确保组件不被篡改。

    通过 C# 从 CLR:

    使用私钥签署程序集 确保持有人 相应的公钥产生 部件。当大会是 安装到GAC,系统 散列文件的内容 包含清单并比较 带有 RSA 数字的哈希值 嵌入在 PE 中的签名值 文件(在用 公钥)。如果值是 相同,文件的内容没有 被篡改了,你知道的 你有公钥 对应于发布者的私有 钥匙。此外,系统哈希 大会的其他内容 文件并比较哈希值 将哈希值存储在 清单文件的 FileDef 表。如果有的话 的哈希值不匹配,在 至少一个程序集的文件有 被篡改,和大会 将无法安装到 GAC。


    更新 2

    为什么需要公钥token?由于公钥太大而无法使用(再次来自 CLR 签证 C#):

    公钥的大小使它们 难以合作。做东西 对开发人员来说更容易(并且最终 用户),公钥令牌是 创建的。公钥令牌是 公钥的 64 位散列。 SN.exe的-tp开关显示公 对应的密钥令牌 完整的公钥在其末尾 输出。 因为公钥是如此之大 数字,并且单个程序集可能 引用许多程序集,一个大的 结果文件的百分比 总大小将被占用 公钥信息。节约 存储空间,微软散列 公钥并取最后 8 个字节 的哈希值。这些减少了 公钥值——称为公钥 令牌——实际存储在 一个 AssemblyRef 表。一般来说, 开发人员和最终用户将看到 公钥令牌值更多 经常比完整的公钥 价值观。但是请注意,CLR 从不使用公钥令牌 做出安全或信任决定 因为有可能有几个 公钥可以散列到单个 公钥令牌。

    【讨论】:

    • 是的,但是为什么要使用公共令牌?
    • 感谢 Aliostad 的更新,但我可能不够清楚:我的问题更多是关于令牌:它看起来像一个冗余数据,所以我想知道为什么我们需要它。仅仅是因为它更短并且不会产生长字符串吗? (这对我来说似乎有点奇怪,以证明令牌的有用性)
    • @Aliostad 嗨,如果我需要获取公钥才能将它与 fullTrustAssemblies 一起使用,你知道我该怎么办吗?...我尝试使用 sn 却没有成功。在此先感谢... brgds
    • @sebastian_h 你不是说你可以在程序集属性中指定的公钥令牌吗?
    • @Aliostad 嗨,我需要公钥作为 ffulltrustassemblies 请求来授予不同的权限。最后我找到了 sn 的方法,但我的开发盒似乎有问题,所以 -> 重新安装 .net 和 mvc .. 谢谢你的回复!
    猜你喜欢
    • 1970-01-01
    • 2013-07-14
    • 2018-04-10
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2017-02-10
    • 2011-03-27
    • 2011-10-13
    相关资源
    最近更新 更多