我已经研究了我愿意为我即将成为应用程序的通用软件许可系统实施的每个元素或系统(无关紧要,因为这应该可以工作,或者可用于我的所有应用程序)。
我创建了一个 DLL,其中包含我的许可类。如下:
(1)
我已经应用了InternalsVisibleTo()
属性主类(带有子类),它使所有内部类及其声明的方法Friend
对具有特定 PublicKey 的外部程序集可见。
我已经引用了应用程序名称,它是 PublicKey。(许可和外部程序集都使用相同的密钥(.snk文件)签名
(2)
所有(在可能的情况下)成员、属性等都被 delcaredFriend
或Private
或只是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 等的每一行Sub
,Function
我都插入了对该函数的调用。
这些只是我为防止外部程序集在另一个应用程序中使用我的 DLL 以利用系统或生成密钥而采取的“安全”措施。
现在是许可措施。
(1)
我有一个密钥生成器(非常基本),它生成给定格式的代码(比如:“ #-$
”代表一个数字,一个破折号,后跟一个字母。)
我在这个程序中包含了一个加密类,它使用Rijndaenal
并应用了 salt。
我已将密钥生成器设置为在生成时加密每个单独的密钥,然后将其附加到文件的新行中,我们将其称为“ my_licenses.txt ”。
我为每个人使用相同的密码(显然)。它很长,并且包含许多不同的字符(如果这有什么不同的话)。我认为这是一种安全的方式,因为我不认为任何人都可以在没有密码的情况下解密字符串,直到另一位程序员告诉我,他建议不要使用纯文本加密作为保护这些密钥的方法。请帮我解决一下这个。
(2)
在我的许可 DLL 中,我有一个声明:
Friend Shared Function IsKeyValid(ByVal KeyDB As String, ByVal Key As String) As Boolean
此函数解密文件中的每个密钥(指定的数据库,使用在密钥生成程序中加密它们时使用的相同密码)。
然后我执行一个循环For Each
,Next
确定指定的“ Key
”值是否等于键“数据库”、“ my_licenses.txt ”中的任何值。但这就是问题所在。
我有一个Function
返回运行它的计算机的唯一代码(使用硬件 ID 等)。这Function
可以帮助我防止在多台计算机上使用相同的密钥(除非我实现了一个允许这样做的系统,有限的时间),并且需要作为“密钥”的最后 5 个字符。
检查后,此函数返回结果值(True
或False
)。
最后(呸),每个程序集(许可程序,以及任何使用它的外部程序)都被CodePlex 的 Confuser (免费且高度.NET的推荐混淆器)。
我希望这不是太长/不够详细/难以理解。(如果是这样,请告诉我你不明白的地方)。
这是我的第一篇文章/任何类型的问题,所以要友善。也感谢您的阅读。
我希望你能帮忙。
为了确认一下,我的问题是:这个系统是否足够安全以防止普通黑客?
PS我只是一个初学者,所以初学者的答案将特别感激;)
*更新:我实际上减少了这个问题的长度,并提高了它的可理解性(信不信由你)。所以这是我能做的最好的。