什么是公钥令牌?如何使用程序集强名称进行计算?什么是“公钥令牌”以及如何使用程序集强名称进行计算?关于你的问题,“如何计算”,它是一个SHA1哈希。来自dotnet博客:Microsoft通过使用强名称程序集的公钥散列来解决“公钥膨胀”问题。这些散列称为公钥令牌,是强名称程序集公钥的SHA1散列的低8字节。SHA1散列是160位(20字节)散列,散列的前12个字节在此算法中被简单地丢弃。您可以通过键入以下命令从VS命令行获取PublicKeyToken:sn–TDLLName.dll如果您需要根据完整的公钥生成公钥令牌,这个小静态方法可以:privatestaticbyte[]GetKeyTokenFromFullKey(byte[]fullKey){SHA1CryptoServiceProvidercsp=newSHA1CryptoServiceProvider();byte[]hash=csp.ComputeHash(fullKey);byte[]token=newbyte[8];for(inti=0;i来自ECMA-335:此声明用于将发起者公钥的SHA-1哈希的低8字节存储在程序集引用中,而不是完整的公钥中。程序集引用可以存储任一完整的公钥或8字节的“公钥令牌”。它们可用于验证在编译时用于对程序集进行签名的同一私钥是否也对在运行时使用的程序集进行了签名。两者都不需要存在,虽然两者都可以被存储,这是没有用的。[理由:存储在程序集引用中的公钥或公钥令牌用于确保引用的程序集和运行时实际使用的程序集是由持有相同私钥的实体生成的,所以可以假设总是出于相同的目的。虽然完整的公钥在密码学上更安全,但它需要更多的引用存储空间。公钥令牌的使用减少了存储引用所需的空间,同时削弱了验证过程仅略。最终原因]至于如何计算散列(我假设这可能是你要求的,因为公钥令牌不是“计算的”),来自相同的规范:CLImetadataallowsproducerofanassemblytocomput该程序集的加密散列值散列值(使用SHA-1散列函数),然后使用RSA算法(参见第I部分)和生成器的公钥/私钥对对其进行加密。选择。然后可以将结果(“SHA-1/RSA数字签名”)与RSA算法所需的密钥对的公共部分一起存储在元数据中(第25.3.3节)。.publickey指令用于指定用于计算签名的公钥。要计算散列,将签名置零,计算散列,并将结果存储在签名中。强名称(SN)签名过程使用标准散列和加密算法进行强名称签名。生成大多数PE文件的SHA-1哈希值。此散列使用SN私钥进行RSA签名。出于身份验证目的,公钥与签名的哈希一起存储在PE文件中。PE文件的所有部分都经过哈希处理,但以下部分除外:?Authenticode签名条目:PE文件可以进行authenticode签名。验证码签名包含在PE头数据目录(第25.2.3.3节中的“证书表”)的偏移量128处的一个8字节条目中,以及该目录条目指定范围内的PE文件的内容。[注意:在符合条件的PE文件中,此项应为零。【尾注】StrongNameBlob:CLI头(25.3.3节中的“StrongNameSignature”)偏移量32处的8字节条目和PE文件中这个RVA包含的哈希数据的内容。如果8字节条目为0,则没有关联的强名称签名。?PE头校验和:PE头的WindowsNT特定字段的偏移量64处的4字节条目(第25.2.3.2节中的“文件校验和”)。[注意:在符合条件的PE文件中,此项应为零。尾注]您可以在此处免费下载该规范:http://www.ecma-international.org/publications/standards/Ecma-335.htm公钥令牌用于识别强名称程序集中的组织。此信息被添加到程序集配置数据库中。我认为理查德对它的存储技术方式是正确的。如果要查看程序集的配置数据库,请使用ILDASM。除了查看IL之外,您还可以深入了解元数据库中存储的内容。它是用于对程序集进行签名的密钥的哈希字节。因此,与其列出密钥的数百个十六进制数字,它更简单,但冲突风险仍然很小。以上是C#学习教程:什么是公钥令牌?如何使用程序集强名称进行计算?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
