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

Posted

技术标签:

【中文标题】对具有引用程序集的应用程序进行数字签名的正确方法【英文标题】:Proper way to digitally sign the application having referenced assemblies 【发布时间】:2015-02-05 03:11:40 【问题描述】:

我有一个包含 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

【问题讨论】:

我想也许你必须使用 -vf 参数运行 Sn.exe(强名称工具),并测试返回码。或者甚至可能捕获并解析输出。 msdn.microsoft.com/en-us/library/cc713694%28v=vs.110%29.aspx 有一个注册表设置可以满足您的需求。 @RenniePet:是的,我可以使用StrongNameSignatureVerificationEx 进行手动检查,但我期待能够按照预期进行自我检查。他们禁用了框架 3.5 的验证以加快应用程序的启动。但即使禁用它也是坏的。 当您说“手动”时,我想知道我们的意思是否相同。我建议您在运行时通过使用 Process.Start() 启动 sn.exe 程序来运行它。 (我同意整个强大的名称业务有点混乱。我想我读到了一些关于 .Net 下一版本中的改进但现在找不到。)编辑:啊,现在我明白你的意思了通过使用 StrongNameSignatureVerificationEx,这比启动 sn.exe 更好。 如何使用ILMerge将你的.exe和.dll合并为一个.exe,然后你的数字证书应该确保整个东西没有被篡改? research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx 【参考方案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);

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

经过一番研究,我发现了这些帖子:

How to prevent spoofing of DLLs in .NET http://ianpicknell.blogspot.com.br/2010/02/evading-strong-name-integrity-check.html

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

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

【讨论】:

是的,我一直在通过互联网阅读,这些链接就是其中之一,而且强名称似乎已损坏,而且它使用 SHA1。微软推出了EnhancedStrongName,它使用 SHA256,但它来自 .net 4.5。

以上是关于对具有引用程序集的应用程序进行数字签名的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

C#进阶系列03 配置文件管理与程序集的引用版本重定向

最适合包含 10 维数值数组的数据集的聚类方法

CLR详解CLR中的程序集

.NET 4.0 无法解析对 System.Web.Extensions 程序集的引用

如何删除对 Dependencies/Frameworks/Microsoft.NETCore.App 中未使用程序集的引用?

c#2005调试程序正常,生成了引用的dll文件,但是生成程序后在其他机器上使用,总是出现缺少程序集的错误