6

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

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

长版:

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

最后——这似乎是关键——我真的很想使用非对称加密来增加生成新密钥的难度。

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

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

我还查看了确实生成密钥的 CocoaFob,但它太长了,无论如何我都想将它作为文件传递。

用 OpenSSL 玩了一会儿,但想不出任何合理长度的东西。

所以......我在这里遗漏了一些明显的东西吗?有没有办法生成一个非对称加密的哈希并将其归结为合理数量的明确的、人类可读的字符?

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

非常感谢您的解决方案!

PS - 是的,我知道它仍然会被破解。我试图想出一些合理的东西,作为用户,我仍然会觉得很友好。

4

5 回答 5

1

抱歉不行。如果将其缩短,则会丢失信息并且无法重新创建原始哈希。

但是,您可以尝试以下几件事:

  • 使用 base32。将其映射到字母表中所有没有歧义的可用字母。(0vsO 等)
  • 使用 DSA,它往往比 RSA 更紧凑。
  • 使您的输入更短(例如,截断 sha1 哈希或使用 md5)也可能使输出更短。
于 2011-01-04T23:32:30.287 回答
0

Treat each SHA1 character as hex, perhaps drop any unnecessary formatting, (dashes or brackets), use some array mapping to convert 0-9A-F as say A-P in some random order, use that as your 'human' entered text. MD5 will give you your 32 chars or a few more for SHA1. Unmap the chars back to your SHA1/MD5 string/bytes and proceed from there.

于 2010-06-17T15:03:22.413 回答
0

加密部分我不会回答,但是我已经开始做注册界面的事情是在界面被提升时检查剪贴板中的文本。如果剪贴板上有文本,请扫描它以查看用户是否从某处(电子邮件、网页等)复制了他们的注册信息,如果您发现可能是您的注册信息/密钥的信息,请预先填写注册信息与它交互。

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

于 2011-03-04T15:19:02.810 回答
0

目前创建短许可证密钥的最佳基于签名的方法似乎是Boneh-Lynn-Shacham 签名方案,尽管它是相当新的(没有那么多评论)并且没有在常见的加密工具中实现。

这是一种使用通用 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 生成更短的签名。

于 2016-06-03T12:43:42.920 回答
-1

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

于 2010-04-28T00:50:02.400 回答