7

.Net security noob here...阻止其他人加载我的程序集的最简单方法是什么?

背景:虽然我真的在寻找“足够好”的保护(有足够的时间/金钱/聪明,有人可以成功破解、破解和攻击),但这似乎应该已经是一个已解决的问题,而我只是想念它。

这是我(认为)我知道的:

  1. 根据这个微软文档,虽然强命名可以用作一层安全性,但不一定是这样的(请参阅警告:不要依赖强名称来保证安全。它们仅提供唯一身份。)

    在那^注意,我遇到了无法加载第三方程序集的情况(假设我认为是),因为他们没有签署他们的程序集,但我的所有程序集都是。所以我不得不 ildasm 他们的程序集,用我们自己的 snk 签名,然后 ilasm 回来)才能使用他们的图书馆。所以,强命名对我来说似乎不是一个好的安全机制。 但是......在代码中进行简单检查以验证调用程序集是否使用我的公钥令牌进行了签名?这足够有效吗?

  2. 如果不应该将强命名用于我要完成的工作,那么在 dll 上实施 Authenticode 数字签名检查是否是更好的路由(似乎 wintrust.dll 可以帮助解决这个问题)?

    我一直在使用几个供应商的混淆工具,其中许多都带有许可和各种东西。我可能会使用一些混淆来隐藏一些敏感部分,但是我仍然希望有一种机制来防止有人加载我的敏感库,而不必使用字符串和代码加密等功能,这些功能通常会带来性能(和其他)费用。

回到这个问题,阻止某人加载我的程序集的最简单方法是什么?

4

4 回答 4

4

事实上,您不能 100% 保证您的程序集不会被下载和以不良方式使用。但一些措施可以帮助您:

  1. 签署您的安装包 (msi)。为此,您需要 SSL 证书。用户将在安装过程中看到下载文件的发布者。如果您的安装包被修改 - 签名将被破坏,安装时用户将看到该应用来自未知发布者或其他发布者而不是您。
  2. 强大的程序集命名允许您防止库替换到另一个“坏”库。让我们考虑下一个场景:您将带有库 A 的应用程序部署到某个服务器,或者用户将您的应用程序安装到他/她的计算机上。如果没有强名称,库 A 或任何其他库可以被某些代码替换或修改到另一个版本。例如,这个新版本可以将所有用户密码发送到某个地方或执行其他恶意操作。如果在下载时更改了一个库。Net 将引发强名称验证异常。因此,您的应用程序将被破坏。恶意代码应重新编译所有应用程序库以使应用程序正常工作。这更难。
  3. 混淆也是一件非常重要的事情,它允许非常困难甚至不可能理解汇编内部发生的事情(代码重命名、字符串加密等)。
  4. 如果您有一些非常关键的智能代码,最好将其重写为本机 (C/C++) 代码。
  5. 如果您的应用程序是移动或桌面应用程序并且它发出后端请求,您可以将重要代码移动到服务器端。
于 2017-01-17T18:23:12.210 回答
2

很明显,但可能没那么有用:最简单的方法是删除程序集。

于 2017-01-17T14:46:20.333 回答
2

我认为您想要的是防止人们对您的装配进行逆向工程,对吗?JustDecompiler等工具可以轻松获取您的汇编代码。要混淆您的代码,您总是可以使用一些付费产品(Eazfuscator)或一些开源产品(ObfuscarConfuserEx)。

于 2017-01-17T17:26:51.493 回答
1

一种选择(可能可行也可能不可行)是不给他们组装。如果您可以使您的应用程序基于 Web(例如Software as a Service),那么(使用适当保护的服务器)您的客户端将无法访问程序集。

于 2017-01-17T23:31:02.253 回答