【问题标题】:Do strong-named assemblies in .NET ensure the code wasn't tampered with?.NET 中的强名称程序集是否确保代码没有被篡改?
【发布时间】:2018-11-02 10:23:27
【问题描述】:

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

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

【问题讨论】:

标签: c# .net signing pfx strongname


【解决方案1】:

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

这称为强名称绕过功能

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

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

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

更多详情,请参见以下页面:

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

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

【讨论】:

  • 那么,如果您使用代码签名证书对程序集进行签名,那么检查禁用将不起作用?
  • @AccessDenied :不,因为代码签名证书总是由 Windows 本身验证(你不能禁用它,AFAIK)。强名称是 .NET 应用程序更“本地化”且更简单的解决方案,但完整的代码签名证书可用于任何应用程序,并且设计得非常安全。
  • 好的,现在可以了。仍然如此 - 就检查篡改而言,强命名程序集毫无意义?或者也许有可能在代码隐藏中设置这个标志并混淆它,所以任何注册表项都不会影响它?
  • @Michal_Drwal 这只是意味着您必须为安全付费。例如购买商业证书并享受:comodo.com/e-commerce/code-signing/code-signing-certificate.php
  • 我的公司购买了完整的代码签名证书,但我想执行一些“附加”安全性。但是据我了解和测试,这个购买的完整代码签名证书的验证必须由我自己在代码中完成吗?我引用了一个用购买的证书签名的签名 dll,被篡改过,它仍然有效。所以 Windows 没有注意到签名已被删除。
猜你喜欢
  • 1970-01-01
  • 2015-09-21
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
相关资源
最近更新 更多