-1

我已经研究了我愿意为我即将成为应用程序的通用软件许可系统实施的每个元素或系统(无关紧要,因为这应该可以工作,或者可用于我的所有应用程序)。

我创建了一个 DLL,其中包含我的许可类。如下:


(1)

我已经应用了InternalsVisibleTo()属性主类(带有子类),它使所有内部类及其声明的方法Friend对具有特定 PublicKey 的外部程序集可见。

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

(2)

所有(在可能的情况下)成员、属性等都被 delcaredFriendPrivate或只是Dim...ed 。

(3)

我的许可类别有一个String变量;宣布:

Private Shared _Key As String = "H58N2-00V93"

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

还有一个Public String变量(我们称之为“ AccessKey”),它应该用主类初始化,如下所示:

Dim licDLL As New LicensingAssemblyName.LicensingMainClass With {.AccessKey="H58N2-00V93"}

(4)

然后,我有一个Function(我们称之为“ CheckKey”),它检查Public初始化变量(“ AccessKey”)是否等于预定义的Friend键(“ _Key”),如果它们不相等,则会抛出异常-防止方法继续/使用。

(5)

在 every 等的每一行SubFunction我都插入了对该函数的调用。


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

现在是许可措施。


(1)

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

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

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

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

(2)

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

Friend Shared Function IsKeyValid(ByVal KeyDB As String, ByVal Key As String) As Boolean

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

然后我执行一个循环For EachNext确定指定的“ Key”值是否等于键“数据库”、“ my_licenses.txt ”中的任何值。但这就是问题所在。

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

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


最后(呸),每个程序集(许可程序,以及任何使用它的外部程序)都被CodePlex 的 Confuser 免费且高度.NET的推荐混淆器)。

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

这是我的第一篇文章/任何类型的问题,所以要友善。也感谢您的阅读。

我希望你能帮忙。

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

PS我只是一个初学者,所以初学者的答案将特别感激;)

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

4

4 回答 4

3

那是一堵疯狂的文字墙,所以你有点迷失了我。而且,老实说,当我看到您计划分发的二进制文件中有一个硬编码的密钥时,我就不再认真阅读了……但是您应该问自己两个问题:

  1. 您的应用程序是否可能如此成功以至于对它有足够的需求,以至于具有适当技能的人会倾向于扭转它并发布注册机和/或盗版版本?

  2. 将时间花在为应用程序添加酷炫的功能而不是授权代码上,这对改进应用程序本身没有任何帮助,难道不是更好吗?

不要误会我的意思。我完全赞成人们为他们的工作获得报酬,我不反对人们许可他们的软件;事实上,我参与的一个项目是一个自定义许可引擎,我上次检查时它正在跟踪超过 100,000 个许可。但请确保如果您决定实施许可,您投入的努力不会超过您投入许可的实际软件的努力。


说了这么多,这就是我要做的:

  • 生成大量许可密钥(使用您想要的任何格式)
  • 使用 SHA-256 或 SHA-512 之类的方法对这些密钥进行哈希处理。
  • 创建一个包含键哈希的数组(使用适合您选择的语言的任何语法)。
  • 在应用程序中包含数组。

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

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

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

如果您愿意,您甚至可以加密哈希,尽管这不太可能有助于防止有人针对此方案发起的那种攻击。

需要明确的是:这不是万无一失的(同样,没有许可机制),并且有足够技能的人有可能以多种方式破解它。但几乎可以肯定,它对您的项目来说已经足够好了。

于 2013-03-25T15:21:18.793 回答
1

安全性没有绝对价值,它必须根据收益来衡量。如果您的应用程序包含一些核代码,我会说为此支付专业顾问费用。如果您要存储祖母的秘方 - 您可以开始使用。

我阅读了整篇文章,但仍然不清楚硬编码密钥的用途或您如何管理每个许可证的各个加密密钥:加密不仅仅是您使用的算法有多强或密码有多长;它还涉及如何隐藏密码、如何传输密码、在边缘情况下做什么(连接中断、解密失败等)以及许多其他事情。

从外观上看,我会说你属于“好去”类别,只是因为你的应用听起来不像是一个高调的破解目标,而且你主要想阻止沮丧的开发人员随意破解尝试谁不喜欢您的许可方案(:在对您的代码进行逆向工程时,单独的混淆最能阻止您的代码。我不熟悉您的代码以判断是否有任何其他更简单的方法来绕过许可,例如如果许可文件未绑定到机器或用户配置文件,则复制许可文件本身的流行方法...

于 2013-03-25T15:11:39.213 回答
0

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

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

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

于 2015-01-06T17:51:23.537 回答
-1

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

于 2014-10-06T08:52:41.673 回答