这个问题是关于验证程序集以检查它是否因恶意活动而被篡改。 创建程序集时,将生成元数据。元数据包括类型定义表,类型引用表和清单表等表。引用表包含每个程序集引用的条目,该条目包括引用的程序集,其公钥和哈希值。清单包括为每个程序集引用的程序集的详细信息,它包括程序集名称,其公钥和哈希算法。我还了解到,在加载程序集的运行时,它会生成程序集的数字签名,并在清单中嵌入公钥,并将其与已嵌入程序集中的数字签名进行比较。如果数字签名匹配则加载。 我的问题如下。
答案 0 :(得分:4)
实际上,
“公共语言运行时也执行哈希验证; 程序集清单包含组成该文件的所有文件的列表 汇编,包括每个文件的哈希,因为它存在时 清单已建成。在加载每个文件时,会对其内容进行哈希处理 并与清单中存储的哈希值进行比较。如果是两个 哈希不匹配,程序集无法加载。“ http://msdn.microsoft.com/en-us/library/ab4eace3.aspx
但是...
“每个条目(AssemblyRef元数据表)也包含一些标志 和哈希值。此哈希值旨在作为校验和 引用的程序集的位。 CLR完全忽略此哈希 价值,将来可能继续这样做。“ 杰弗里里希特“通过C#CLR”第3版。
根据我对.Net 4.0程序集的私人调查 - 在程序集绑定阶段实际上忽略了哈希值,即使程序集是由加密密钥签名的,因此具有强名称。
过了一会儿,我意识到strong-name bypass feature导致了这种行为。 因此,您需要“在HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework键下创建名为 AllowStrongNameBypass 的值为0的DWORD条目”,以启用强名称(+ hashsum)验证。
答案 1 :(得分:1)
1:不,它被使用了。 Ecma-335,分区II,.file指令的第6.2.3章:
.hash之后的字节指定为文件计算的哈希值。 VES应在访问此文件之前重新计算此哈希值,如果不匹配则应生成异常。用于计算此哈希值的算法使用.hash算法指定(参见第6.2.1.1节)。
2:仅在启用强名称验证时。请注意,默认情况下,这是完全信任方案中的.NET 3.5 SP1。您必须使用caspol.exe
显式启用它3:假设“强烈命名”,则无法进行验证。