Public Key Token是微软.NET平台中用于验证程序集身份的一种机制。在.NET平台中,每个程序集都拥有一个唯一的标识符,也就是Public Key Token。通过Public Key Token可以验证程序集是否被篡改过,是否是我们所期望的合法程序集。
什么是Public Key Token
Public Key Token是一个16字节大小的十六进制字符串,它是程序集中包含公钥的哈希值。在.NET平台中,程序集是通过数字签名来保证其身份的,这个数字签名就是由程序集的私钥生成,并且包含在程序集中的,同时还有一个公钥也包含在程序集中。为了方便程序集的验证,一般会对公钥进行哈希计算,并将哈希值就是Public Key Token。
通过Public Key Token,我们可以快速判断程序集是否被修改过,因为如果程序集被修改过,那么其Public Key Token也会不同。
如何获取Public Key Token
获取程序集的Public Key Token非常简单,可以通过Visual Studio的命令行工具sn.exe来快速获取。具体步骤如下:
- 打开命令行工具,进入Visual Studio的安装目录(如:
C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\Tools\\
) - 输入命令
sn -T [程序集路径]
,其中[程序集路径]
需要替换为要查看的程序集的路径 - 回车执行命令,即可看到程序集的Public Key Token
Public Key Token的作用
Public Key Token在.NET平台中的作用非常重要,它可以通过以下几个方面来保证程序集的安全性:
- 程序集完整性验证:在程序运行时,CLR会自动验证程序集的数字签名,以此来保证程序集没有被篡改过。而Public Key Token则可以用于判断数字签名是否合法。
- 程序集版本控制:在程序集的数字签名中包含了程序集的版本信息,当更新程序集时,只需要修改版本号即可。而Public Key Token则可以用于判断程序集的版本是否正确。
- 程序集身份鉴定:不同的程序集拥有不同的Public Key Token,可以用于验证某个程序集是否来自可信的来源。
Public Key Token的局限
尽管Public Key Token有很多好处,但它也存在一些局限:
- 容易被篡改:如果攻击者能够获取到程序集的私钥,则可以生成一个新的数字签名,并修改程序集的Public Key Token,从而模拟正常的程序集。
- 只能防止改动攻击:Public Key Token只能用于判断程序集是否被修改过,但无法阻止对程序集的其他攻击,如缓冲区溢出攻击等。
- 容易被替换:如果攻击者能够以同样的Public Key Token生成一个新的程序集,那么这个程序集就可以通过验证,而这个新的程序集可能是恶意的。
总之,Public Key Token是.NET平台中用于保护程序集安全的一个重要机制。它虽然存在一定的局限性,但可以在一定程度上增强程序集的安全性。