【发布时间】:2011-03-30 12:58:22
【问题描述】:
每个签名的 .NET 都有一个公钥令牌(8 个字节)和一个公钥(128 个字节)。 两者有什么区别,为什么我们需要两个公共“密钥”?
【问题讨论】:
每个签名的 .NET 都有一个公钥令牌(8 个字节)和一个公钥(128 个字节)。 两者有什么区别,为什么我们需要两个公共“密钥”?
【问题讨论】:
公钥令牌只是公钥的散列。这里是info。
为什么我们需要公钥?
由于程序集可以被签名并且签名的程序集将包含公钥。加载 DLL 时,.NET 将使用公钥来根据签名验证程序集。签名只能使用私钥生成,而公钥本身可用于验证签名。
此过程可确保组件不被篡改。
通过 C# 从 CLR:
使用私钥签署程序集 确保持有人 相应的公钥产生 部件。当大会是 安装到GAC,系统 散列文件的内容 包含清单并比较 带有 RSA 数字的哈希值 嵌入在 PE 中的签名值 文件(在用 公钥)。如果值是 相同,文件的内容没有 被篡改了,你知道的 你有公钥 对应于发布者的私有 钥匙。此外,系统哈希 大会的其他内容 文件并比较哈希值 将哈希值存储在 清单文件的 FileDef 表。如果有的话 的哈希值不匹配,在 至少一个程序集的文件有 被篡改,和大会 将无法安装到 GAC。
为什么需要公钥token?由于公钥太大而无法使用(再次来自 CLR 签证 C#):
公钥的大小使它们 难以合作。做东西 对开发人员来说更容易(并且最终 用户),公钥令牌是 创建的。公钥令牌是 公钥的 64 位散列。 SN.exe的-tp开关显示公 对应的密钥令牌 完整的公钥在其末尾 输出。 因为公钥是如此之大 数字,并且单个程序集可能 引用许多程序集,一个大的 结果文件的百分比 总大小将被占用 公钥信息。节约 存储空间,微软散列 公钥并取最后 8 个字节 的哈希值。这些减少了 公钥值——称为公钥 令牌——实际存储在 一个 AssemblyRef 表。一般来说, 开发人员和最终用户将看到 公钥令牌值更多 经常比完整的公钥 价值观。但是请注意,CLR 从不使用公钥令牌 做出安全或信任决定 因为有可能有几个 公钥可以散列到单个 公钥令牌。
【讨论】: