对具有引用程序集的应用程序进行数字签名的正确方法

时间:2014-12-07 09:53:54

标签: c# .net .net-assembly digital-certificate strongname

我的应用程序有一个引用的程序集(test.exe,test.dll)

我想要的是当test.exe运行时,它应该将出版商名称显示为" TestCompany"。

为此,我对它进行了数字签名,它就是我想做的。如果我改变test.exe的一个字节,则出版商名称为"未知"。哪个好。

但是如果我改变test.dll,应用程序就会运行,因为没有发生任何事情,并将发布者名称显示为" TestCompany"。这对我没有好处。

因此,我在test.dll上添加了强名称,并在app.config中添加了<bypassTrustedAppStrongNames enabled="false" />

再次,没有区别。所以我再次搜索并发现bypassTrustedAppStrongNames只检查程序集是否具有强名称。不是验证。这对我来说再好不过了。

我真正想要的是保护用户,而不是我的应用程序。如果用户运行我的应用程序并且它从我这里说出来,它必须来自我的每个字节。如果应用程序被更改,即使是单个字节,它也必须通知用户,而不是来自我。这是数字签名与强名称一起做的,但它们似乎都不是那么好。或者我错过了什么?

我能想到的最后一种可能的方法是手动检查装配的强名称。

PS:目标.net框架是2.0

1 个答案:

答案 0 :(得分:1)

我的项目中没有加载大多数重要的程序集作为参考。 我所做的是声明互操作接口(所有项目通用作为基础...是的,引用这个...)然后我在运行时加载所有程序集:

 Assembly assembly = Assembly.Load("myDll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1");
 Type type = assembly.GetType("MyClass");
 object instanceOfMyType = Activator.CreateInstance(type);

我使用它有几个原因。我有不同的类实现,我必须根据用户/客户配置调用。它似乎是一个很好的选择,可以保证您使用我的公共令牌和版本加载特定程序集。

经过一番研究后,我找到了这些帖子:

嗯,看了你的问题后我感到很震惊。它引起了我对现在引用我的DLL的担忧。我不知道这是多么安全,但它似乎比仅仅参考它更安全。

我在MS文档中未找到任何有关使用Assembly.LoadbypassTrustedAppStrongNames的参考资料。我稍后会进行一些测试,但使用它似乎更安全。