据我了解,强命名会创建程序集的加密哈希值,该哈希值用作加载dll的强名称。
我希望使用此功能来检测二进制文件的损坏,以通知用户软件存在问题,并且需要重新安装。
这适用于对二进制文件的一些更改,但是我发现修改二进制文件,特别是二进制文件中的静态字符串,不会导致应用程序报告它找不到相应强名称的dll。
有人可以向我解释一下程序集中的哪些数据用于创建强名称,以及为什么强命名并不总能检测到dll的修改?有没有办法可以强制它在强命名中包含其他信息?
我是否有另一种方法可以检测到二进制文件的损坏?
干杯
赖安
答案 0 :(得分:0)
您应该在这里查看:Authenticode Signatures and Strong Name Signatures和How do I Sign .Net assemblies with Authenticode signature?
这两个签名完全相互独立。强名称有助于为程序集提供唯一标识。 Authenticode允许您验证程序集的作者是谁。
和
如果两种类型的签名都应用于程序集,则强名称签名将包含在Authenticode签名中。这意味着我可以修改Authenticode签名的字节,使其在不使强名称签名失效的情况下不再有效。反之亦然 - 修改强名称签名的字节会使它和Authenticode签名无效。
答案 1 :(得分:0)
据我所知,强命名中使用的哈希包含整个文件,因此我不确定为什么某些更改不会使验证失效。
你的装配是否有可能被添加到跳过验证列表中?
答案 2 :(得分:0)
强大命名程序集时创建的数字签名散列程序集的内容,使用任何Authenticode签名的异常,程序集的强名称数据和PE头校验和,然后签署哈希用私钥。
也许这是您正在更改的被排除项目之一,在这种情况下,强名称仍将正确验证,并且程序集仍将正常加载。
根据定义,强名称由四个属性组成:文件名(减去扩展名),版本号,文化标识和公钥标记(公钥的哈希)。无法在强命名约定中包含其他信息。
答案 3 :(得分:0)
我检测到相同的行为。我强命名了程序集,然后使用十六进制编辑器修改了一些静态字符串。令人惊讶的是,正在加载程序集的可执行文件没有引发任何异常,而只是加载了更改后的库。 在Microsoft文档中进行了一些搜索之后,我发现了一条提示对我有帮助。
这是说有一种旁路机制,在某些情况下,该机制可以更快地加载程序集。
要禁用此旁路功能,请在app.config中添加一个标志。
<runtime>
<bypassTrustedAppStrongNames enabled="false" />
</runtime>
这样做之后,在修改程序集时,可执行文件将引发异常。