对具有引用程序集的应用程序进行数字签名的正确方法
本文关键字:数字签名 方法 应用程序 引用 程序集 | 更新日期: 2023-09-27 18:33:20
我有一个应用程序有 1 个引用的程序集(test.exe、test.dll(
我想要的是当test.exe
运行时,它应该将发布者名称显示为"TestCompany"。
为此,我对它进行了数字签名,它做了我想做的事。如果我更改test.exe
的一个字节,发布者名称为"未知"。这很好。
但是如果我更改test.dll
,该应用程序将像什么都没有发生一样运行,并将发布者名称显示为"TestCompany"。这对我不好。
所以我在test.dll
上加上了强名称,并在 app.config 中添加了<bypassTrustedAppStrongNames enabled="false" />
。
同样,没有区别。所以我再次搜索,发现bypassTrustedAppStrongNames
只检查程序集是否具有强名称。不是验证。这又对我不好。
我真正想要的是保护用户,而不是我的应用程序。如果用户运行我的应用程序并且它说它来自我,那么它必须来自我作为每个字节。如果应用程序被更改,即使是单个字节,它也必须通知用户,而不是来自我。这就是数字签名应该与强名称一起做的事情,但它们似乎都不是那么好。还是我错过了什么?
我能想到的最后一种可能的方法是手动检查程序集的强名称。
PS : 目标 .net 框架是 2.0
我的大多数重要程序集都没有作为参考加载到我的项目中。我所做的是声明互操作接口(所有项目通用作为基础...是的,这是引用的。然后我在运行时使用以下方法加载所有程序集:
Assembly assembly = Assembly.Load("myDll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1");
Type type = assembly.GetType("MyClass");
object instanceOfMyType = Activator.CreateInstance(type);
我使用它有几个原因。我有不同的类实现,我必须根据用户/客户配置调用这些实现。这似乎也是一个不错的选择,可以保证您使用我的公共令牌和版本加载特定程序集。
经过一番研究,我发现了这些帖子:
- 如何防止在 .NET 中欺骗 DLL
- http://ianpicknell.blogspot.com.br/2010/02/evading-strong-name-integrity-check.html
好吧,看完你的问题后我有点震惊..这引起了我对现在引用我的 DLL 的担忧。我不知道这有多安全,但它似乎比仅仅引用它更安全。
我在 MS 文档中没有找到任何关于使用 Assembly.Load
和 bypassTrustedAppStrongNames
的参考。我稍后会运行一些测试,但使用它似乎更安全。