1

我正在创建一个简单的许可证密钥系统来“让诚实的人保持诚实”。我不关心特别严格的密码学。

如果他们对演示限制感到恼火,他们会去我的注册网站,付款,然后给我他们的电子邮件。我给他们一个许可证密钥。

我让事情变得非常简单,所以:

license_key = md5(email + "Salt_String");

我有 PHP 和 C# 函数运行相同的算法并获得相同的密钥。

问题是这些函数的输出是一个 32 个字符的字符串,例如:

A69761CF99316358D04771C5ECFCCDC5

这可能很难记住/输入。是的,我知道复制/粘贴,但我想让所有付费客户真正轻松地解锁软件。

我应该以某种方式将这个长字符串转换成更短的字符串吗?

假设我只使用前 6 位数字,所以:A69761

显然,其中存在更多的密码冲突,但在实际使用中它是否重要?

还有其他想法可以使事物更具人类可读性/可输入性吗?

4

2 回答 2

3

留下 6-10 个符号就足够了 - 用户无论如何都无法猜测代码,并且很容易输入。另外一个好主意是在您的服务器上注册每个许可证,这样您就可以检查用户是否真的诚实,并且没有将许可证密钥提供给其他人。

于 2011-01-12T10:07:33.367 回答
1

根据我的经验,要求用户键入或复制/粘贴 30 个字符的代码确实会导致客户感到沮丧。并不是说它那么难。这只是人们不关心的障碍。

我用于业务的解决方案是单独试用和购买下载。要获得他们的许可副本,客户需要在下载表单上输入他们的电子邮件地址和一个简短的用户 ID。仅输入电子邮件会自动重新发送用户 ID。你没有问过这个问题,但是一个自动查找客户需要的任何代码的系统比拥有一个简单的系统更重要。下载系统在数据库中查找用户的详细信息并提供其中嵌入了用户许可证的 SetupSomeProductCustomerName.exe。此设置安装客户的许可副本,无需任何进一步的标识或服务器连接。

这个系统对我们来说非常有效。客户只需备份一个文件,并且不会丢失任何序列号,以确保他们将来可以重新安装软件。

也就是说,如果您更喜欢使用使用单向散列的系统,只需使用生成较小散列的算法即可。例如,CRC-32 产生 8 个十六进制数字。

散列在加密上是没有意义的。破解者会简单地遍历您的代码,复制整个代码块,将电子邮件地址变异到许可证密钥中,然后将其粘贴到他们的密钥生成器中。然后他们可以为任何电子邮件地址生成许可证密钥。无论您的散列算法有多复杂,他们都可以做到这一点。

如果你想防止这种情况发生,你需要使用公钥加密,这会导致密钥太长而无法输入。如果你走这条路,你要么需要用长密钥来骚扰你的客户,要么单独的密钥文件,或者使用我上面描述的个性化下载系统。

于 2011-01-12T12:35:17.697 回答