c# – CLR如何验证我的应用程序是否使用了正确的程序集

我知道这是通过使用私钥签署程序集来完成的.

所以我在这里看到了这个过程……
当我们拥有私钥/公钥对文件时,我们可以使用此密钥构建程序集签名.
因此,在完成性方面做的是编译器打开’sk'(或pfx)文件并检索私钥(我理解这对于人类是不可能的),并且在使用私钥对程序集进行签名之后,它将公钥添加到程序集清单中那就是我有一个强烈命名的集会.

那么当我运行引用该程序集的应用程序时呢?
什么CLR确保该组合没有被替换,什么都没有改变?

解决方法:

通过C#从CLR引用

Signing an assembly with a private key
ensures that the holder of the
corresponding public key produced the
assembly. When the assembly is
installed into the GAC, the system
hashes the contents of the file
containing the manifest and compares
the hash value with the RSA digital
signature value embedded within the PE
file (after unsigning it with the
public key). If the values are
identical, the file’s contents haven’t
been tampered with, and you know that
you have the public key that
corresponds to the publisher’s private
key. In addition, the system hashes
the contents of the assembly’s other
files and compares the hash values
with the hash values stored in the
manifest file’s FileDef table. If any
of the hash values don’t match, at
least one of the assembly’s files has
been tampered with, and the assembly
will fail to install into the GAC.

好吧,这是它的工作原理.

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

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

上一篇:c# – 如何在任何基于CLR的语言程序集中找到给定类型的所有类型依赖?


下一篇:c# – CLR:内存中const字符串值的生命周期是多少?