c# - .NET 中的强名称程序集是否确保代码未被篡改?

标签 c# .net signing pfx strongname

我正在尝试了解 .NET 中强命名程序集的意义。在谷歌上搜索它时,我注意到到处都说它确保代码来 self 并且没有被篡改。所以我测试了它。我创建了一个简单的 DLL,使用新创建的 PFX key 对其进行签名,并由我的 WPF 应用程序引用它。好的,一切正常。当我用另一个 PFX 文件编译 DLL 时出现错误,所以没关系。

但是,当我通过 ildasm 反编译 DLL、修改它并通过 ilasm 重新编译它时,WPF 应用程序仍然可以正常运行,没有任何错误。所以我篡改了强命名的 DLL 并用旧的手动更改它,应用程序仍然可以使用被篡改的 DLL。 PublicKeyToken 是相同的。那么强命名有什么意义呢?它不能确保代码没有被篡改,因为我对它进行了强命名。

最佳答案

它用于检查篡改,但在应用程序启动时检查每个强名称签名程序集的开销太高,因此 Microsoft disabled this behaviour by default a number of years ago (早在发布“.NET Framework 3.5 版 Service Pack 1”时)。

这称为强名称绕过功能

您可以通过将以下内容添加到其“.config”文件来禁用特定应用程序的功能(即让 Windows 检查篡改):

<configuration>  
  <runtime>  
    <bypassTrustedAppStrongNames enabled="false" />  
  </runtime>  
</configuration>  

您可以通过编辑注册表为所有应用程序启用强名称检查(这显然不是一个可行的解决方案!)。

更多详细信息,请参阅以下页面:

https://learn.microsoft.com/en-us/dotnet/framework/app-domains/how-to-disable-the-strong-name-bypass-feature

如果您想防止代码篡改,现在的建议是为您的可执行文件和 DLL 使用完整的代码签名证书。

关于c# - .NET 中的强名称程序集是否确保代码未被篡改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53116713/

相关文章:

c# - 触发操作系统以编程方式复制(ctrl+c 或 Ctrl-x)

IronPython 的核心 Python 模块的 C# 或其他 .NET 等效项?

git - 如何验证git中每个提交的作者

ios - 我如何处理我已经接管的项目的分配?

c# - 如何使用 LINQ 方法语法计算子集合的项数?

c# - 如何从 ItemTemplate 中将命令绑定(bind)到 ContextMenu?

c# - 替代 session /静态变量 ASP.NET/C#

c# - 通过类名或类型获取程序集或 dll C#

.net - 无法加载文件或程序集 X 或其依赖项之一。不是有效的Win32应用程序。 (HRESULT : 0x800700C1)

android - 检测 Apk 中的代码篡改