我的(WinForms)应用程序的许可系统。这会足够安全吗? (在合理范围内)

时间:2013-03-25 14:58:11

标签: vb.net security encryption licensing copy-protection

我已经研究了我愿意为我即将成为的应用程序实现通用软件许可系统的每个元素或系统(无关紧要,因为这应该可行,或者可以在我的所有应用程序上使用)。< / p>

我已经在其中创建了一个带有许可类的DLL。 它如下:


(1)

我已经应用了 InternalsVisibleTo() 属性主类(带有子类),这使得所有内部类及其方法都被声明为 {{1} ,对于带有sepcified PublicKey的外部程序集可见。

我已经引用了应用名称,它是PublicKey。 (许可和外部程序集都使用相同的密钥签名( .snk 文件)

(2)

所有(如果可能)成员,财产等已经过 Friend Friend 或仅 Private ...编辑

(3)

我的授权类有一个 Dim 变量;宣称:

String

如果你愿意,这个变量是我的DLL的特殊密码,并且需要访问我的DLL中的方法。

还有 Private Shared _Key As String = "H58N2-00V93" 变量(我们称之为“ Public String ”),应该使用主类初始化,如这样:

AccessKey

(4)

然后,我有一个 Dim licDLL As New LicensingAssemblyName.LicensingMainClass With {.AccessKey="H58N2-00V93"} (让我们称之为“ Function ”),它会检查 {{1 ,初始化变量(“ CheckKey ”等于预定义的 Public 键(“ AccessKey “),如果它们不相等则抛出异常 - 阻止方法继续/使用。

(5)

在每个 Friend _Key 等的第一行,我已插入对此功能的调用。


这些只是我为避免外部程序集在另一个应用程序中使用我的DLL而采取的“安全”措施,可能会利用系统或生成密钥。

现在进行许可措施。


(1)

我有一个密钥生成器(非常基本),它以给定的格式生成代码(例如:“Sub”代表一个数字,一个破折号,后跟一个字母。)

我在此程序中包含了一个加密类,它使用Function并应用salt。

我已将密钥生成器设置为在生成时加密每个单独的密钥,然后将其附加到文件的新行,我们将其称为“ my_licenses.txt ”。

我为每个人使用相同的密码(显然)。它很长,包括许多不同的角色(如果这有任何区别)。我认为这是一种安全的方式,因为我不认为任何人可以在没有密码的情况下解密字符串,直到另一位程序员告诉我,他建议不要使用纯文本加密作为保护这些密钥的方法。请帮帮我。

(2)

在我的许可DLL中,我有一个声明:

#-$

此函数解密文件中的每个密钥(指定的数据库,使用在密钥生成程序中加密它们时使用的相同密码)。

然后我执行RijndaenalFriend Shared Function IsKeyValid(ByVal KeyDB As String, ByVal Key As String) As Boolean循环,确定指定的“ For Each ”值是否等于键'数据库'中的任何值,“的 my_licenses.txt ”。但这就是问题所在。

我有一个 Next ,它会为正在运行的计算机返回一个唯一的代码(使用硬件ID等)。这个 Key 可以帮助我防止在多台计算机上使用相同的密钥(除非我实现了允许这个,有限时间的系统),并且需要作为“最后5个字符”键”。

检查后,此函数返回结果的值( Function Function )。


最后(phew),每个程序集(许可证一个,以及任何使用它的外部程序集)都被混淆 - 并且同样签名(所有程序集,使用相同的密钥( .snk )文件) - 由 CodePlex的Confuser .NET 的免费且强烈推荐的混淆器)。

我希望这不会太久/不够详细/难以理解。 (如果是这样,告诉我你不明白的地方)。

这是我的第一篇文章/问题,所以要好。也谢谢你的阅读。

我希望你能提供帮助。

为了确认,我的问题是:这个系统是否足够安全以防范普通黑客?

P.S。我只是一个初学者,所以特别感谢初学者的答案;)

* 更新 :我实际上缩短了这个问题的长度,并提高了它的可理解性(信不信由你)。所以这是我能做的最好的事情。

4 个答案:

答案 0 :(得分:3)

这是一个疯狂的文本墙,所以你有点失去了我。而且,说实话,当我看到你打算分发的二进制文件中有一个硬编码的密钥时,我就不再认真阅读......但是你应该问自己两个问题:

  1. 您的应用程序是否可能如此成功以至于对它有足够的需求,以便拥有相应技能的人倾向于撤销它并释放keygen和/或盗版版本?

  2. 您不应该花更多时间在应用程序中添加很酷的功能而不是许可代码,这些代码无法改善应用程序本身吗?

  3. 别误会我的意思。我全都是因为人们为他们的工作获得报酬而且我并不反对那些许可他们软件的人;事实上,我所研究的其中一个项目是一个自定义许可引擎,我检查后跟踪了超过100,000个许可证。但请确保如果您决定实施许可,那么您投入的许可不会超过您在实际软件中投入的许可。


    尽管如此,这就是我要做的事情:

    • 生成许多许可密钥(使用您想要的任何格式)
    • 使用SHA-256或SHA-512之类的东西来哈希那些键。
    • 创建一个包含关键哈希值的数组(使用适合您所选语言的任何语法)。
    • 在您的应用程序中包含该数组。

    使用该设置,要验证许可证,您需要做的就是:

    • 使用与以前相同的算法对输入进行哈希处理。
    • 迭代数组,将其与散列结果进行比较。如果匹配,则密钥已获得许可。如果他们不这样做,继续。
    • 如果到达表的末尾,则密钥未获得许可。
    • 如果密钥未获得许可,请勿立即退出应用程序。而是设置一个标志,防止使用重要命令(例如“保存”)或设置一个60秒的计时器加上一个随机数退出应用程序。

    使用Authenticode编译然后对您的应用程序进行数字签名。让应用程序本身验证签名以试图阻止随意篡改。

    如果你如此倾向,你甚至可以对哈希进行加密,尽管这不太可能有助于抵御某人对这种方案的攻击。<​​/ p>

    要明确:这是防弹(然后再次,没有许可机制),并且有足够技能的人可以通过多种方式打破它。但对你的项目来说,这几乎肯定会足够好。

答案 1 :(得分:1)

安全性没有绝对值,必须根据收益来衡量。如果你的应用程序持有一些核代码,我会说为此付一个专门的顾问。如果你正在存储奶奶的秘密食谱 - 你很高兴。

我阅读了整个帖子,目前还不清楚硬编码密钥的用途是什么,或者如何为每个许可证管理单独的加密密钥:加密不只是关于您使用的算法有多强或者您使用了多长时间密码是;它也是关于你如何隐藏你的密码,你如何传输它们,你在边缘情况下做什么(中断连接,解密失败等)和许多其他事情。

从它的外观来看,我会说你处于“好去”类别只是因为你的应用程序听起来不像是一个高调的目标要破解,你大多想要阻止偶然的破解尝试一个沮丧的开发人员,他不喜欢你的许可方案(:当涉及到对代码进行逆向工程时,单独的混淆会阻止最多。我不熟悉你的代码,告诉他们是否还有其他更简单的方法可以绕过授权,如复制许可文件本身的流行方法,如果它不依赖于机器或用户配置文件......

答案 2 :(得分:0)

网上有很多解决方法,但这里描述的散列系统或基于公钥加密的东西都可以足够安全地提供许可。

我个人更喜欢并使用商业产品: http://www.treekslicensinglibrary.com - Treek的许可库。它便宜,易于设置且非常安全,因为它使用以前的公钥加密技术来处理许可证。

编辑:要与序列号的哈希值进行比较 - 此解决方案不需要预定义接受的序列号。 apps = 1000个许可证中的1000个哈希值,您需要更新应用程序。基于公钥加密的许可证系统没有这个缺点。

答案 3 :(得分:-1)

您可以使用.NET Obfuscate应用程序来保护它。所有.NET应用程序都可以使用.NET Reflector进行反编译,因此在浏览器中搜索应用程序以混淆.net应用程序。这将起作用我知道,每个想要反编译你的应用程序的人都会通过混淆

来防止