加密.Net应用程序和程序集

时间:2009-01-30 01:43:41

标签: .net encryption dongle

我有加密/复制保护问题。

我正在为使用加密狗的公司编写应用程序。请不要告诉我软件保护是无用的,或者我应该让它自由地飞到空中,或者我花费这么多时间是浪费;这不是关于软件保护有效性的哲学问题,更像是如何操作。

据我了解,破解加密狗保护软件的第一步是从代码中删除对加密狗的所有调用(即修补可执行文件)。另据我理解,我可以在.NET中创建“强名称”以保护应用程序和程序集,如in this MSDN article所述。

强大的命名是否足以确保我的应用程序无法轻松修补?或者我是否需要使用某种加密库?如果我需要使用一个库,哪一个,或者哪里可以获得有关设置的信息?

当然,下一步是将重要的算法放在加密狗上。我意识到这些只是专用饼干的速度颠簸,但随着我们的市场份额的增长,减速带来帮助我们达到不太强烈感受海盗的刺痛(我希望)。

谢谢!

5 个答案:

答案 0 :(得分:8)

程序集强命名从未设计用于防止攻击机器的攻击者。来自msdn entry on delay signing

  

以下示例将关闭已调用程序集的验证   MyAssembly.dll程序。

     

sn –Vr myAssembly.dll

强名称的设计目标是提供名称唯一性并保护用户(而非发布者)免受攻击者攻击。如果用户想要禁用所有强名称检查,或者甚至删除您的签名并使用他自己的密钥重新签名程序集,那么从技术上讲,没有什么可以阻止他这样做。

简单地从加密文件加载程序集也不是很有用,因为解密代码本身无法加密,因此很容易成为逆向工程的目标。

正如其他海报所述,您正在寻找的是混淆。您可能已经拥有这样一个工具:Visual Studio(至少2005年和2008年)附带PreEmptive Solutions社区版Dotfuscator. Microsoft也有自己的“Software Licensing and Protection Services”产品。

混淆有一些技术上的缺点:

  • 可能会使您的构建过程复杂化。 你需要一个unobfuscated和一个 模糊的构建,因为后者 是不可调试的。
  • 我喜欢有意外例外的错误对话框,用户可以点击“复制详细信息”并向我发送包含堆栈跟踪等技术信息的邮件。然而,通过混淆,你可以忘记获得任何有用的东西 来自Exception.StackTrace
  • 如果您的代码使用了reflection那么 事情很有可能 在混淆的构建中中断,因为不保留内部类型和成员名称。

答案 1 :(得分:4)

签署您的程序集将无法在不更改签名的情况下对其进行更改,从而使其成为参考。这样做的结果是对程序集的(强名称)引用将无法解决更改后的版本。这保证不会有荒谬的赔率。

但这并不能解决你的问题。不管怎么说,还不完全。如果你把你的加密狗调用打包到一个强名称的程序集中,然后从你的应用程序中引用该程序集,那么没有你未经改动的程序集,应用程序将无法工作,因此不能没有加密狗。但应用程序本身可以改变!

另一种可用的方法是混淆。 Visual Studio附带了一个免费版的混淆器,可以升级到工业级。混淆使代码难以理解而不改变它的行为,因此为逆向工程提供了真正的障碍。

我认为解决方案在于巧妙地将这两种技术结合起来。

这就是我的知识范围,我很害怕。其他人必须在这里提供实际答案(而且它可能比我的短得多; - )

答案 2 :(得分:2)

如果他们正在修补您的可执行文件,强名称无济于事。但是,它会帮助您确保您引用的dll是正确的版本并且没有被篡改 你可能会检查 混淆Salamanderpreemptive 您可以查看加密Assembly LockboxCodeVeil, 或ThinApp

答案 3 :(得分:1)

如果您想使用加密狗并加密您的程序,本文可能对您有用:http://www.gironsec.com/blog/2012/02/dongles-how-do-they-work/

以下是该文章的相关引用:

There are 2 ways to implement a dongle. The right way and the wrong way. The right way would be to encrypt your programs and store the encryption key on the dongle and decrypt at run time depending on whether the device is connected or not.

答案 4 :(得分:0)

在某种程度上,混淆可能对您有用。但它不是100%安全的方式。事实上,没有任何100%安全的方法来保护任何软件模块。在最好的情况下,混淆只会使程序的逆向工程变得耗时。 .NET Reflector是一个逆向工程工具,可以从任何.NET程序集中重新生成源代码。使用Dotfuscator将使入侵者难以理解原始源代码,但如果奖励很大,可以努力对该源代码进行很好的估计。