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

C# 对具有引用程序集的应用程序进行数字签名的正确方法,c#,.net,.net-assembly,digital-certificate,strongname,C#,.net,.net Assembly,Digital Certificate,Strongname,我有一个具有1个引用程序集(test.exe、test.dll)的应用程序 我想要的是,当运行test.exe时,它应该将发布者名称显示为“TestCompany” 为了做到这一点,我对它进行了数字签名,它做了我想做的事情。如果我更改test.exe的一个字节,则发布者名称为“未知”。这很好 但是,如果我更改test.dll,应用程序将以未发生任何事情的状态运行,并将发布者名称显示为“TestCompany”。这对我不好 所以我在test.dll上加了强名称,并在app.config中添加了 同

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

我想要的是,当运行
test.exe
时,它应该将发布者名称显示为“TestCompany”

为了做到这一点,我对它进行了数字签名,它做了我想做的事情。如果我更改
test.exe
的一个字节,则发布者名称为“未知”。这很好

但是,如果我更改
test.dll
,应用程序将以未发生任何事情的状态运行,并将发布者名称显示为“TestCompany”。这对我不好

所以我在
test.dll
上加了强名称,并在app.config中添加了

同样,没有区别。因此,我再次搜索,发现
绕过TrustedAppStrongNames
只检查程序集是否具有强名称。不是核查。这又对我不好了

我真正想要的是保护用户,而不是我的应用程序。若用户运行我的应用程序,并且它说它来自我,那个么它必须来自我,就像每个字节一样。如果应用程序被修改,即使是一个字节,它也必须通知用户,这不是我写的。这就是数字签名与强名称一起应该做的,但它们似乎都不太好。还是我遗漏了什么

我能想到的最后一种可能的方法是手动检查程序集的强名称


PS:Target.net framework是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);
我使用它有几个原因。根据用户/客户配置,我必须调用不同的类实现。这似乎也是一个很好的选择,可以保证您正在加载带有我的公共令牌和版本的特定程序集

经过一番研究,我发现了以下帖子:

看了你的问题后我有点震惊。。这引起了我现在对引用DLL的担忧。我不知道这有多安全,但它似乎比仅仅引用它更安全


我在MS文档中找不到任何有关使用
Assembly.Load
BypassedTrustedAppStrongNames
的参考。稍后我将运行一些测试,但使用它似乎更安全。

我认为您可能需要使用-vf参数运行Sn.exe(强名称工具),并测试返回代码。或者甚至可以捕获并解析输出。有一个注册表设置可以满足您的要求。@RenniePet:是的,我可以使用
strongnamesignatureificationex
手动检查,但我希望它能按预期的方式检查自身。他们禁用了框架3.5中的验证,以加快应用程序的启动。但即使禁用它也会被破坏。当你说“手动”时,我想知道我们是不是指同一件事。我建议您在运行时使用Process.Start()启动sn.exe程序。(我同意整个强名称业务有点混乱。我想我读到了一些关于下一版本.Net的改进,但现在找不到。)编辑:啊,现在我明白你使用StrongNameSignatureReferationEx的意思了,这比启动sn.exe要好。使用ILMerge将.exe和.dll合并为一个.exe如何,然后您的数字证书应确保整个内容未被篡改?是的,我一直在网上阅读,这些链接就是其中之一,强名称加上它的用途似乎被破坏了。微软推出了
EnhancedStrongName
,它使用SHA256,但它来自.net 4.5。