使用非对称加密生成合理长度的许可证密钥?

时间:2010-04-28 00:35:02

标签: license-key

我整天都在看这个。几个小时前我可能应该离开它;在这一点上,我可能会遗漏一些明显的东西。

简短版本:有没有办法生成并将非对称加密的哈希值归结为合理数量的明确的,人类可读的字符?

长版:

我想为我的软件生成许可证密钥。我希望这些键具有合理的长度(25-36个字符)并且易于人类读取和输入(因此避免使用数字0和大写字母O等模糊字符。)

最后 - 这似乎是踢球者 - 我真的很想使用非对称加密来使生成新密钥变得更加困难。

我有一般的方法:将我的信息(用户名,产品版本,盐)连接成一个字符串并从中生成一个SHA1()哈希,然后用我的私钥加密哈希。在客户端上,从相同的信息构建SH​​A1()哈希,然后使用公钥解密许可证,看看我是否有匹配。

由于这是一款Mac应用程序,我查看了AquaticPrime,但这会产生一个相对较大的许可证文件而不是字符串。如果必须,我可以使用它,但作为用户,我非常喜欢我可以阅读和打印的许可证密钥的便利性。

我还看了CocoaFob确实生成了一个密钥,但是它太长了以至于无论如何我想把它作为一个文件提供。

fooled around with OpenSSL有一段时间但是无法想出任何合理长度的东西。

所以...我错过了一些明显的东西吗?有没有办法生成并将非对称加密的哈希值归结为合理数量的明确的,人类可读的字符?

我愿意购买解决方案。但我在许多不同的平台上工作,所以我想要一些便携的东西。到目前为止,我所看到的一切都是特定于平台的。

很多,非常感谢您的解决方案!

PS - 是的,我知道它仍然会被破解。我想提出一些合理的东西,作为一个用户,我仍然会发现友好。

5 个答案:

答案 0 :(得分:1)

不幸的是,没有。如果缩短,则会丢失信息,并且无法重新创建原始哈希值。

但是,您可以尝试以下几种方法:

  • 使用base32。将其映射到字母表中不含糊不清的所有可用字母。 (0vsO等)
  • 使用DSA,它往往比RSA更紧凑。
  • 缩短输入(截断sha1哈希,或者使用md5)可能会缩短输出。

答案 1 :(得分:0)

将每个SHA1字符视为十六进制,可能删除任何不必要的格式,(破折号或括号),使用一些数组映射将0-9A-F转换为某些随机顺序的AP,将其用作“人类”输入的文本。对于SHA1,MD5会为您提供32个字符或更多字符。将字符取消映射回SHA1 / MD5字符串/字节并从那里继续。

答案 2 :(得分:0)

我不会在加密部分回答,但是我开始做注册接口的事情是在引发接口时检查剪贴板上的文本。如果剪贴板上有文本,请扫描它以查看用户是否已从某处复制其注册信息(电子邮件,网页等),如果您发现 可以 的信息strong>是你的注册信息/密钥,用它预先填充注册界面。

在界面上显示一个小警报也是一个好主意,表明信息已成功从剪贴板中删除(或不是!),以便用户知道发生了什么或没发生过什么。

答案 3 :(得分:0)

创建简短许可证密钥的最佳签名方法目前似乎是the Boneh–Lynn–Shacham signature scheme,虽然它是最新的(没有那么多评论),并且没有在常见的加密工具中实现。

这是一种使用通用openssl和bash的方法:

openssl ecparam -genkey -name sect113r1 -out private.key # generate the private key (store it on your server)
openssl ec hist-in private.key -pubout -out public.key # generate a public key (store it in the client software)
# generate a random one time activation userID or a hardware-based one here (CLIENT SIDE)
user_id="unique_on_the_fly_generated_user_ID" # send the user ID to the server for license generation
signature=""
return_value=0
while [[ $return_value == 0 ]]
do
    signature=$(echo "$user_id" | openssl dgst -sign private.key | base64 > signature.txt) # generate a user licence
    echo "$signature" | egrep -q 'O|l|/|\+|=' # check for ambiguous chars
    return_value=$?
done
echo "$signature" | base64 -d > signature.txt # send the signature/license to the client
openssl dgst -verify public.key -signature signature.txt # verify signature (CLIENT SIDE)

请注意,您仍然可以获得48个字符长的签名/许可证密钥(以及可以避免发送的通用“M”标头字符)。据我所知,目前无法使用openssl生成较短的签名。

答案 4 :(得分:-1)

我会考虑MD5算法。它被广泛实现,无论输入大小如何,都会生成一个32个字符的字母数字字符串。将算法应用于SHA1哈希值,它可能就是您要查找的内容。