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

Pra*_*rma 24 c# publickeytoken

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

Cer*_*rus 16

关于你的问题,"它是如何计算的",它是一个SHA1哈希.

来自dot net博客:

Microsoft通过使用强名称程序集的公钥的哈希来解决"公钥膨胀"问题.这些哈希称为公钥标记,是强名称程序集公钥的SHA1哈希的低8字节.SHA1哈希值是160位(20字节)哈希值,并且在此算法中简单地丢弃哈希值的前12个字节.


Sau*_*mar 11

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

sn –T DLLName.dll
Run Code Online (Sandbox Code Playgroud)


Tod*_*bus 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;
    }
Run Code Online (Sandbox Code Playgroud)


mle*_*rle 5

从ECMA-335:

此声明用于在程序集引用中存储始发者的公共密钥的SHA-1哈希的低8个字节,而不是完整的公共密钥。
程序集引用可以存储完整的公共密钥或8字节的“公共密钥令牌”。可以使用两种方法来验证用于在编译时对程序集进行签名的同一私钥也可以对在运行时使用的程序集进行签名。既不需要存在,又可以存储,但这没有用。

[理由:程序集引用中存储的公钥或公钥令牌用于确保引用的程序集和运行时实际使用的程序集是由拥有相同私钥的实体生产的,因此可以假定为旨在达到相同的目的。尽管完整的公共密钥在密码上更安全,但它在引用中需要更多的存储空间。使用公共密钥令牌减少了存储引用所需的空间,而只是稍微削弱了验证过程。最终理由]

关于散列的计算方式(我认为这可能是您要的,因为未“计算”公钥令牌),基于相同的规范:

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

强名称(SN)签名过程使用标准哈希和密码算法进行强名称签名。生成了大多数PE文件上的SHA-1哈希。该哈希值由SN私钥进行RSA签名。出于验证目的,公钥以及签名的哈希值都存储在PE文件中。
除以下内容外,PE文件的所有部分均被散列:•Authenticode签名条目:可以对PE文件进行Authenticode签名。Authenticode签名包含在PE头数据目录的偏移量128的8字节条目中(第25.2.3.3节中的“证书表”),并且PE File的内容在此目录条目指定的范围内。[注:在合格的PE文件中,该条目应为零。[注释]•强名称Blob:CLI标题的偏移量32(在§25.3.3中为“ StrongNameSignature”)的8字节条目,以及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