Eri*_*ert 155
公钥令牌的作用是什么?
公钥令牌是一个小数字,它是表示公钥的方便的"令牌".公钥很长; 公钥令牌的目的是让你在不说出整个密钥的情况下引用密钥.有点像"指环王"这五个词代表一个五十万字的小说.如果你每次想谈论它都会很不方便,你必须陈述那些五十万字.
它是否有任何解密签名哈希的部分?
不可以.公钥令牌中没有"信息".它只是一个代表公钥的数字.它本身不是公钥.
为什么微软有那么多具有相同公钥令牌的程序集?
因为它们都使用相同的私钥(Microsoft的私钥)签名,因此都使用相同的公钥进行验证,因此它们都具有相同的公钥令牌.
ris*_*ism 14
来自维基百科
"公钥标记用于使程序集名称唯一.因此,两个强名称程序集可以具有相同的PE文件名,但.NET会将它们识别为不同的程序集.Windows文件系统(FAT32和NTFS)只识别PE文件名,因此具有相同PE文件名(但文化,版本或公钥令牌不同)的两个程序集不能存在于同一个Windows文件夹中.为了解决这个问题,.NET引入了一个名为GAC(全局程序集缓存)的东西,它是.NET CLR将其视为单个文件夹,但实际上是使用嵌套的NTFS(或FAT32)文件夹实现的.
为了防止欺骗攻击,当一个破解者试图传递出现为其他东西的程序集时,程序集会使用私钥进行签名.预期程序集的开发人员将私钥保密,因此破解者无法访问它,也不能简单地猜测它.因此,饼干不能使他的组件冒充别的东西,缺乏在改变后正确签名的可能性.对程序集进行签名涉及获取程序集的重要部分的哈希值,然后使用私钥加密哈希值.签名的哈希与公钥一起存储在程序集中.公钥将解密签名的哈希.当CLR加载一个强命名的程序集时,它将从程序集生成一个哈希值,然后将其与解密的哈希值进行比较.如果比较成功,则表示文件中的公钥(以及公钥标记)与用于对程序集签名的私钥相关联.这意味着程序集中的公钥是程序集发布者的公钥,因此挫败了欺骗攻击."
哈希是一种"指纹".它使用签名者拥有(并且仅为已知)的私钥进行签名.如果你知道签名者的公钥,你可以检查哈希是否真的来自签名者,因此数据/文件是否真的来自签名者(并且没有改变).GAC中某些文件的相同公钥表示"全部由同一签名者签名".
公钥标记是真实公钥的一些可读取的摘录.完整的公钥存储在已签名的程序集中,用于解密签名(=加密的哈希).加载程序使用它来验证内容是否未被篡改(或损坏).原始哈希由作者使用私钥加密,只有拥有该密钥的人才能生成有效签名.
每个公司(或部门)应该只使用1个密钥对,这就是您在GAC中看到相同PKT组的原因.