CLR如何验证我的应用程序正在使用正确的程序集

本文关键字:程序集 应用程序 我的 何验证 验证 CLR | 更新日期: 2023-09-27 18:00:43

我知道这是通过用私钥对程序集进行签名来完成的。

我是如何看待这个过程的。。。当我们拥有私钥/公钥对文件时,我们可以使用这些密钥来构建对其进行签名的程序集。因此,实际上所做的是编译器打开"sk"(或pfx)文件并检索私钥(我知道这对人类来说是不可能的),在用私钥对程序集进行签名后,它将公钥添加到程序集清单中,这就是我拥有的强命名程序集。

那么,当我运行适当引用它的应用程序时该怎么办呢?CLR如何确保assebly没有被替换,也没有任何更改?

CLR如何验证我的应用程序正在使用正确的程序集

CLR通过C#引用

使用私钥对程序集进行签名确保生成的相应公钥装配当组件安装到GAC中,系统散列文件的内容包含清单并进行比较RSA数字的哈希值PE中嵌入的签名值文件(用公钥)。如果值为相同,文件的内容没有被篡改了,你知道你有公钥对应于发布者的私有钥匙此外,系统散列程序集的其他文件并比较哈希值其中哈希值存储在manifest文件的FileDef表。如果有的哈希值不匹配,位于程序集的至少一个文件具有被篡改,并且程序集将无法安装到GAC中。

好吧,这就是它的工作原理。

当编译程序集时,注意到要使用已生成的公钥/私钥对文件对其进行签名,编译器会计算程序集的哈希(还计算程序集中每个文件的哈希,并将值与文件名一起存储在FileDef表中),然后用私钥对哈希值进行签名,并将公钥嵌入该程序集的清单中。

现在,在运行时,当应用程序(程序集)尝试加载已签名的程序集时,程序集将再次进行哈希处理,然后CLR从程序集清单中获取公钥,解密RSA符号,并将哈希值与符号值进行比较。如果它们是一样的,那么什么都没有改变。

强名称包含公钥的指纹。因此CLR可以验证puplic密钥是否与名称匹配,以及程序集是否使用相应的私钥签名。

关于强命名的好文章:http://ondotnet.com/pub/a/dotnet/2003/04/28/strongnaming.html

设置从一个程序集到另一个程序集中的引用时,调用程序集存储被调用程序集公钥的表示形式。在运行时,CLR可以使用它来检查引用的程序集是否来自正确的供应商。

相关文章: