PublicKeyToken和公钥有什么区别?

时间:2011-03-30 12:58:22

标签: .net security signature

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

1 个答案:

答案 0 :(得分:6)

公钥令牌只是公钥的哈希。这里是info


更新

  

为什么我们需要公钥?

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

此过程可确保装配不被篡改。

从CLR到C#:

  

使用私钥对程序集进行签名   确保持有人   相应的公钥产生了   部件。组装时   安装到GAC系统中   哈希文件的内容   包含清单和比较   RSA数字的哈希值   PE中嵌入的签名值   文件(在用它取消签名之后)   公钥)。如果值是   相同,文件的内容没有   被篡改了,你就知道了   你有公钥   对应于出版商的私人   键。另外,系统哈希   程序集的内容是另一个   文件并比较哈希值   用哈希值存储在   清单文件的FileDef表。如果有的话   哈希值不匹配,at   至少有一个程序集的文件   被篡改,和集会   将无法安装到GAC中。


更新2

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

  

公钥的大小使它们成为现实   难以合作。做事   对开发人员来说更容易(并且为了结束   用户也是)公钥令牌   创建。公钥令牌是   公钥的64位哈希。   SN.exe的-tp开关显示公共   对应的密钥令牌   最终完整的公钥   输出。   因为公钥很大   数字和单个装配可能   引用很多组件,很大   生成的文件的百分比   总大小将被占用   公钥信息。节约   存储空间,微软哈希   公钥并占用最后8个字节   散列值。这些减少了   公钥值 - 称为公钥   令牌 - 实际存储的内容   AssemblyRef表。一般来说,   开发人员和最终用户会看到   公钥标记值更多   经常比完整的公钥   值。但请注意CLR   从来没有使用过公钥标记   做出安全或信任决定   因为有可能是几个   公钥可以散列为单个   公钥令牌。