C# 对具有引用程序集的应用程序进行数字签名的正确方法
我有一个具有1个引用程序集(test.exe、test.dll)的应用程序 我想要的是,当运行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中添加了 同
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);
我使用它有几个原因。根据用户/客户配置,我必须调用不同的类实现。这似乎也是一个很好的选择,可以保证您正在加载带有我的公共令牌和版本的特定程序集
经过一番研究,我发现了以下帖子:
我在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。