.net - 使用强名称签名如何防止伪造一组程序集?

标签 .net assemblies strongname snk

使用强名称(存储在 .snk 文件中的 key 对)进行签名(以及其他用途)意味着 protect against forging assemblies .

例如:我发布我的程序集以强名称签名,然后其他一些开发人员使用我的程序集,因此他的程序集现在包含对我的引用,提到了我的 key 对的公钥。一些用户安装了该开发人员程序集和我的程序集,并愉快地使用了该开发人员的代码。如果其他人试图制作一个看起来像我的版本的程序集,并说服用户这是一个“值得安装的更新”,则伪造的程序集将无法加载,因为我控制着我的 key 对,并且该伪造的程序集未使用相同的 key 对进行签名.好吧,爽。

但是什么可以防止恶意方伪造我的程序集和其他开发人员的依赖程序集并将它们“发送”?他们获取我的程序集和该开发人员的程序集,篡改两者,使用任何 key 对我的程序集的伪造版本进行签名,然后将对其的引用添加到依赖程序集的伪造版本中,也对其进行签名,然后将两者都发送出去。我的意思是恶意“运送”两个程序集不应该比“运送”一个程序集困难得多。

使用强名称签名如何防止伪造多个程序集?

最佳答案

强命名程序集实际上并不意味着保护已签名的程序集。这是为了保护正在加载已签名程序集的其他程序集。

例如,如果某个 EXE 受信任并且想要从已知位置(例如 GAC、网络共享、Internet 等)加载已知 DLL,则可以使用强名称来执行此操作,并且具有一定程度的置信度组装没有被篡改。

但是,如果整个程序集被反汇编然后重新组装和重新签名,那么是的,你是对的,他们可以重新编写加载其余程序集的代码行,以便它加载它们新(假)键。

但这种篡改是显而易见的。换句话说,强名称签名提供了明确的篡改证据,但并不能在所有情况下阻止篡改。此外,本地管理员可以完全禁用强名称验证(出于“开发”目的),而且强名称签名显然不是万无一失的安全机制。

Authenticode 和驱动程序签名也是如此。我们都见过一种产品,它指示用户“忽略安全警告”。如果强名称验证被禁用或整个程序集的签名被剥离,这基本上就是 EXE 将要做的 - 它会忽略警告。

关于.net - 使用强名称签名如何防止伪造一组程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4859896/

相关文章:

visual-studio - asp.net 可部署程序集

visual-studio-2010 - 如何使用 VS 2010 或 VS 2013 分析签名程序集

.net - 我可以找到在文件中构建的目标 .NET dll 吗?

.net - 为什么可以使用反射从签名程序集中加载未签名程序集中的类型?

.net - 强烈命名第 3 方程序集 - 无法加载文件或程序集

c# - 如何使用C#收集网络统计信息,例如Ping ms,下载速率,数据包丢失

c# - 是否可以有条件地编译为 .NET Framework 版本?

c# - 没有新对象的子节点的 XML 序列化

c# - MVVM Light Toolkit 的文档/示例?

c# - 如何在大型代码库中组织外部库