PublicKeyToken和公钥有什么区别?

sth*_*ers 7 .net security signature

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

Ali*_*tad 7

公钥标记只是公钥的哈希.这里有信息.


UPDATE

为什么我们需要公钥?

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

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

从CLR到C#:

使用私钥对程序集进行签名可确保相应公钥的持有者生成程序集.当程序集安装到GAC中时,系统会对包含清单的文件内容进行哈希处理,并将哈希值与嵌入在PE文件中的RSA数字签名值进行比较(在使用公钥取消后).如果值相同,则文件的内容未被篡改,并且您知道您拥有与发布者的私钥对应的公钥.此外,系统会散列程序集的其他文件的内容,并将散列值与清单文件的FileDef表中存储的散列值进行比较.如果任何散列值不匹配,则至少有一个程序集的文件已被篡改,并且程序集将无法安装到GAC中.


更新2

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

公钥的大小使得它们难以使用.为了使开发人员(以及最终用户)更容易,创建了公钥标记.公钥令牌是公钥的64位哈希.SN.exe的-tp开关显示与其输出结尾处的完整公钥对应的公钥标记.由于公钥是如此大的数字,并且单个程序集可能引用了许多程序集,因此大部分结果文件的总大小将被公钥信息占用.为了节省存储空间,Microsoft对公钥进行哈希处理,并获取哈希值的最后8个字节.这些减少的公钥值(称为公钥标记)实际存储在AssemblyRef表中.通常,开发人员和最终用户将比完整公钥值更频繁地看到公钥令牌值.但请注意,CLR在做出安全性或信任决策时从不使用公钥标记,因为有些公钥可能会散列到单个公钥令牌.