每个签名的.NET都有公钥令牌(8字节)和公钥(128字节)。 2之间有什么区别,为什么我们需要两个公共“密钥”?
答案 0 :(得分:6)
公钥令牌只是公钥的哈希。这里是info。
为什么我们需要公钥?
由于程序集可以签名,签名程序集将包含公钥。加载DLL .NET时,将使用公钥根据签名验证程序集。签名只能使用私钥生成,而公钥本身可用于验证签名。
此过程可确保装配不被篡改。
从CLR到C#:
使用私钥对程序集进行签名 确保持有人 相应的公钥产生了 部件。组装时 安装到GAC系统中 哈希文件的内容 包含清单和比较 RSA数字的哈希值 PE中嵌入的签名值 文件(在用它取消签名之后) 公钥)。如果值是 相同,文件的内容没有 被篡改了,你就知道了 你有公钥 对应于出版商的私人 键。另外,系统哈希 程序集的内容是另一个 文件并比较哈希值 用哈希值存储在 清单文件的FileDef表。如果有的话 哈希值不匹配,at 至少有一个程序集的文件 被篡改,和集会 将无法安装到GAC中。
为什么需要公钥令牌?由于公钥太大而无法使用(再次来自CLR签证C#):
公钥的大小使它们成为现实 难以合作。做事 对开发人员来说更容易(并且为了结束 用户也是)公钥令牌 创建。公钥令牌是 公钥的64位哈希。 SN.exe的-tp开关显示公共 对应的密钥令牌 最终完整的公钥 输出。 因为公钥很大 数字和单个装配可能 引用很多组件,很大 生成的文件的百分比 总大小将被占用 公钥信息。节约 存储空间,微软哈希 公钥并占用最后8个字节 散列值。这些减少了 公钥值 - 称为公钥 令牌 - 实际存储的内容 AssemblyRef表。一般来说, 开发人员和最终用户会看到 公钥标记值更多 经常比完整的公钥 值。但请注意CLR 从来没有使用过公钥标记 做出安全或信任决定 因为有可能是几个 公钥可以散列为单个 公钥令牌。