我正在创建一个简单的许可证密钥系统,以“保持诚实的人诚实”。我不关心特别严格的加密。
如果他们对示例限制感到恼火,他们会去我的注册网站,付款并给我他们的电子邮件。我给他们许可证密钥。
我保持简单,所以:
license_key = md5(email + "Salt_String");
我有PHP和C#函数运行相同的算法并获得相同的密钥。
问题是这些函数的输出是一个32个字符的字符串,如:
A69761CF99316358D04771C5ECFCCDC5
可能很难记住/输入。是的,我知道复制/粘贴,但我希望所有付费客户都能轻松解锁软件。
我应该以某种方式将这个长字符串转换为更短的字符串吗?
假设我只使用前6位数字,所以:A69761
显然有更多的加密冲突,但在实际使用中是否重要?
任何其他想法使这个东西更易于人类阅读/打字?
答案 0 :(得分:3)
左边6-10个符号就足够了 - 用户无论如何也无法猜测代码,并且输入很容易。 同样好的想法是在您的服务器上注册每个许可证,这样您就可以检查该用户是否真的诚实,并且没有向其他人提供许可证密钥。
答案 1 :(得分:1)
根据我的经验,要求用户输入或复制/粘贴30个字符的代码确实会导致客户感到沮丧。这不是那么困难。这只是人们不关心的障碍。
我用于my business的解决方案是单独试用和购买下载。要获取其许可副本,客户需要在下载表单中键入其电子邮件地址和短用户ID。仅输入电子邮件会自动重新发送用户ID。您没有问过这个问题,但是自动查找客户需要的任何代码的系统比拥有一个简单的系统更重要。下载系统在数据库中查找用户的详细信息,并提供嵌入了用户许可证的SetupSomeProductCustomerName.exe。此设置安装客户的许可副本,无需任何进一步的标识或服务器连接。
这个系统对我们来说非常好用。客户只有一个备份文件,没有序列号丢失,以确保将来可以重新安装该软件。
也就是说,如果您更喜欢使用使用单向散列的系统,只需使用生成较小散列的算法即可。例如。 CRC-32产生8个十六进制数字。
哈希在加密安全方面毫无意义。破解者只需遍历您的代码,将整个电子邮件地址的代码块复制到许可证密钥中,然后将其粘贴到他们的密钥中。然后他们可以为任何电子邮件地址生成许可证密钥无论您的哈希算法有多复杂,他们都可以做到这一点。
如果你想阻止这种情况,你需要使用公钥加密,这导致密钥太长而无法输入。如果你走这条路,你要么需要用长按键来烦扰你的客户粘贴或分开密钥文件,或使用我上面描述的个性化下载系统。