.NET 中的强名称程序集是否确保代码未被篡改?
Do strong-named assemblies in .NET ensure the code wasn't tampered with?
我正在尝试了解 .NET 中强命名程序集的意义。在谷歌上搜索它时,我注意到到处都说它确保代码来自我并且没有被篡改。所以我测试了它。我创建了一个简单的 DLL,使用新创建的 PFX 密钥对其进行签名,并由我的 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>
您可以通过编辑注册表为所有应用程序启用强名称检查(这显然不是一个可行的解决方案!)。
详情请看以下页面:
如果您想防止代码被篡改,现在的建议是为您的可执行文件和 DLL 使用完整的代码签名证书。
我正在尝试了解 .NET 中强命名程序集的意义。在谷歌上搜索它时,我注意到到处都说它确保代码来自我并且没有被篡改。所以我测试了它。我创建了一个简单的 DLL,使用新创建的 PFX 密钥对其进行签名,并由我的 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>
您可以通过编辑注册表为所有应用程序启用强名称检查(这显然不是一个可行的解决方案!)。
详情请看以下页面:
如果您想防止代码被篡改,现在的建议是为您的可执行文件和 DLL 使用完整的代码签名证书。