在.NET中使用强名称程序集确保代码没有被篡改?

Mic*_*wal 7 .net c# strongname signing pfx

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

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

Mat*_*son 5

它用于检查篡改,但是在应用程序启动时检查每个强名称签名的程序集的开销太高,因此Microsoft在几年前默认禁用了此行为(回到".NET Framework 3.5版Service Pack"时) 1"被释放了".

这称为强名称旁路功能.

您可以通过在其".config"文件中添加以下内容来禁用特定应用程序的功能(即,使Windows检查篡改):

<configuration>  
  <runtime>  
    <bypassTrustedAppStrongNames enabled="false" />  
  </runtime>  
</configuration>  
Run Code Online (Sandbox Code Playgroud)

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

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

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

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