什么是公钥令牌?如何在汇编强名称中计算?

时间:2009-02-21 14:09:32

标签: c# publickeytoken

什么是'公钥令牌'?它是如何用汇编强名来计算的?

6 个答案:

答案 0 :(得分:16)

关于你的问题,“它是如何计算的”,它是一个SHA1哈希。

来自dot net blog

  

Microsoft解决了“公钥”问题   膨胀“使用哈希的问题   强名称程序集的公钥。   这些哈希称为公共哈希   关键令牌,是低8字节的   强名称的SHA1哈希   程序集的公钥。 SHA1哈希是   160位(20字节)哈希值,顶部   简单地说,12个字节的哈希值   在此算法中丢弃。

答案 1 :(得分:10)

您可以通过键入以下命令从VS命令行获取PublicKeyToken:

sn –T DLLName.dll

答案 2 :(得分:6)

如果您需要基于完整的公钥生成公钥令牌,这个小静态方法可以工作:

   private static byte[] GetKeyTokenFromFullKey(byte[] fullKey)
    {
        SHA1CryptoServiceProvider csp = new SHA1CryptoServiceProvider();
        byte[] hash = csp.ComputeHash(fullKey);
        byte[] token = new byte[8];
        for (int i = 0; i < 8; i++ )
            token[i] = hash[hash.Length - (i+1)];

        return token;
    }

答案 3 :(得分:4)

来自ECMA-335:

  

此声明用于存储发起方的SHA-1哈希的低8字节   汇编引用中的公钥,而不是完整的公钥   程序集引用可以存储完整的公钥或8字节的“公钥令牌”。可以使用任何一个   验证用于在编译时对程序集进行签名的同一私钥也签署了用于的程序集   运行。两者都不需要存在,虽然两者都可以存储,但这没有用。

     

[原理:存储在程序集引用中的公钥或公钥令牌用于确保   被引用的程序集和在运行时实际使用的程序集由拥有的实体生成   相同私钥的,因此可以假定它们是出于同一目的。虽然   完整的公钥是加密更安全的,它需要在引用中有更多的存储空间。使用公钥   令牌减少了存储引用所需的空间,同时仅略微削弱了验证过程。   最终理由]

关于如何计算哈希值(我假设这可能是你要求的,因为公钥令牌没有“计算”),来自同一规范:

  

CLI元数据允许程序集的生产者计算该程序集的加密哈希值(使用   SHA-1散列函数)然后使用RSA算法(参见分区I)和公共/私有加密它   生产者选择的关键对。然后可以存储该结果(“SHA-1 / RSA数字签名”)   在元数据(第25.3.3节)中以及RSA算法所需的密钥对的公共部分。该   .publickey指令用于指定用于计算签名的公钥。计算   哈希,签名归零,哈希计算,然后将结果存储到签名中。

     

强名称(SN)签名过程使用标准哈希和密码算法进行强名称签名。一个   生成大多数PE文件的SHA-1哈希。该哈希值使用SN私钥进行RSA签名。对于   验证目的公钥存储在PE文件中,以及签名的哈希值   除以下内容外,PE文件的所有部分都经过哈希处理:   •Authenticode签名条目:PE文件可以是authenticode签名的。正宗的   签名包含在PE头数据目录的偏移128处的8字节条目中   (§25.2.3.3中的“证书表”)和由此指定的范围内的PE文件的内容   目录条目。 [注意:在符合条件的PE文件中,此条目应为零。结束说明]   •强名称Blob:CLI标头偏移32处的8字节条目(“StrongNameSignature”   在§25.3.3)和PE文件中此RVA中包含的哈希数据的内容。如果是8字节   条目为0,没有关联的强名称签名。   •PE标头校验和:PE标头Windows NT特定的偏移64处的4字节条目   字段(§25.2.3.2中的“文件校验和”)。 [注意:在符合条件的PE文件中,此条目应为零。   结束说明]

您可以在此免费下载规范:http://www.ecma-international.org/publications/standards/Ecma-335.htm

答案 4 :(得分:3)

公钥标记用于标识强名称程序集中的组织。此信息将添加到程序集元数据库中。我认为理查德对其存储的技术方式是正确的。

如果要查看程序集的元数据库,请使用ILDASM。除了查看IL之外,您还可以深入了解存储在元数据库中的内容。

答案 5 :(得分:0)

这是用于对程序集进行签名的密钥的哈希字节。

因此,不是列出密钥的数百个十六进制数字,而是更简单,但仍然几乎没有碰撞的风险。