c# - 在 C#/.NET 中运行应用程序之前检查 DLL 是否真实/正确

标签 c# .net assemblies checksum dll-injection

您好,我正在尝试弄清楚如何确保提供的 DLL 是正确的。 原因是我们的分布式解决方案是由许多小型 DLL 构建的,每个 DLL 都包含应用程序的某些部分,有时我们会推出其中一些的新版本。

这不是一个“更新问题”,而是一个很好的问题 - 我们如何检查是否:

  1. 它是正确的二进制/汇编

  2. 客户/客户篡改了该文件,并可能将其替换为具有类似功能的同名文件,从而返回错误值?

多种原因

这可以用于复制保护/许可证测试或其他重要的验证问题,所以我试图弄清楚 MD5 校验和 + 某种汇编信息是否足够? (如果是这样,如何访问程序集详细信息或类似信息?)

当然,当您可以反编译 .NET DLL 时,没有什么是万无一失的,但正是因此,我们希望确保有人不只是反编译我们的函数列表,然后编写我们的“哦,如此重要”DLL 的自己的替换 DLL。

我们的原因是,当我们遇到因错误或目的而破坏这些内容的客户时,调试/支持所需的麻烦量(我们不关心原因,我们只是尽力防止大多数可能的错误)。

最佳答案

我看到两个选项:

  1. Digital signing 。您需要购买数字证书,但是一旦您使其发挥作用,您就可以对文件的来源非常有信心。还有一个优点是,您的程序不会在 Windows Vista 及更高版本中被标记为来自“未知发布者”。

  2. 哈希。您可以使用 MD5 (或更好 SHA-1 )哈希值。非常容易实现,但可以解决保护问题(尽管这样做并不简单)。

关于c# - 在 C#/.NET 中运行应用程序之前检查 DLL 是否真实/正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4120381/

相关文章:

c# - 如何获得证书 key 大小

c# - Redis 和 Siglnar 偶尔会在 EVAL 上挂起 SocketFailure

c# - HttpClient 和套接字耗尽 - 澄清?

c# - 依赖注入(inject)可以防止循环依赖吗?

c# - 在 C# 中将文本转换为 bool 表达式

c# - 我想要 "clone"谷歌日历与 c# .net 的接口(interface)

c# - "Could not find type"在 Windows 窗体设计器中加载窗体时出错

c# - 为什么 "as"运算符在 C# 中不使用隐式转换运算符?

.net - 我可以在不重新编译的情况下将程序集转换为强命名程序集吗?

c# - 部署 NetFwTypeLib 以管理 Windows 防火墙