生成许可证密钥的最佳机制


35

人们会建议使用哪些方法/库/工具来生成许可证密钥(注册软件时放入的那些可爱的AAAAA-AAAAA-AAAAA-AAAAA-AAAAA东西)?

在实施它们时需要注意什么?

(目前,我对此有兴趣,而不是特定于语言,因此,如果解决方案是特定于语言的,请说明您使用的是哪种语言)。

Answers:


23

它与存储密码时大致相同。您应该具有仅生成器和程序已知的唯一密钥。使用此键可操纵详细信息(用户名,密码,组织等),然后对其进行哈希处理。然后,您可以在散列上的Base32中进行一些琐碎的传输编码,或者如果您不关心格式,只需将其移动到十六进制字符串即可。

在实施它们时需要注意什么?

保守秘密并分开。使您的实施不可行。如果有人中断了,您可以轻松地更改实现吗?在桌面应用程序上的一种常见实现是使用远程服务器来验证许可证。这就消除了有人可以通过检查应用程序本身来对哈希或算法进行反向工程的可能性。


11
BASE32编码是标准。它允许人类用户轻松输入;)(Base32:字母和数字的选择非常不同。例如,序列中没有0和O)

1
@Pierre:我不知道,很好的信息!
乔什(Josh K)2010年

10

在SO上问了同样的问题,接受的答案非常好。一般要点是:

  • 取用户名
  • 将用户名,密钥和哈希与(例如)SHA1关联
  • 将SHA1哈希作为字母数字字符串解压缩。这是个人用户的“产品密钥”
  • 在程序中,执行相同的哈希,然后与产品密钥进行比较。如果相等,则确定。

1

我的首选方法是生成10,000个随机许可证字符串,将SHA1(或MD5)哈希或HMAC哈希,并将SHA1 / MD5哈希的全部或部分包括在可执行文件本身中。输入许可证字符串后,您只需使用混淆代码即可生成字符串的哈希并将其与列表中的哈希进行比较。如果匹配,则是有效许可证。如果许可证不足,请发布包含更多字符串的新版本。

仅使用SHA1哈希的前96位就足够了。因此,10,000个许可将占用120KB以下的空间。算法生成密钥或创建密钥生成器将是不可能的。您唯一需要担心的漏洞是逆向工程或绕过。(或者有人分发其有效密钥。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.