我整天都在看这个。几个小时前我可能应该离开它;在这一点上,我可能会遗漏一些明显的东西。
简短版本:有没有办法生成并将非对称加密的哈希值归结为合理数量的明确的,人类可读的字符?
长版:
我想为我的软件生成许可证密钥。我希望这些键具有合理的长度(25-36个字符)并且易于人类读取和输入(因此避免使用数字0和大写字母O等模糊字符。)
最后 - 这似乎是踢球者 - 我真的很想使用非对称加密来使生成新密钥变得更加困难。
我有一般的方法:将我的信息(用户名,产品版本,盐)连接成一个字符串并从中生成一个SHA1()哈希,然后用我的私钥加密哈希。在客户端上,从相同的信息构建SHA1()哈希,然后使用公钥解密许可证,看看我是否有匹配。
由于这是一款Mac应用程序,我查看了AquaticPrime,但这会产生一个相对较大的许可证文件而不是字符串。如果必须,我可以使用它,但作为用户,我非常喜欢我可以阅读和打印的许可证密钥的便利性。
我还看了CocoaFob确实生成了一个密钥,但是它太长了以至于无论如何我想把它作为一个文件提供。
我fooled around with OpenSSL有一段时间但是无法想出任何合理长度的东西。
所以...我错过了一些明显的东西吗?有没有办法生成并将非对称加密的哈希值归结为合理数量的明确的,人类可读的字符?
我愿意购买解决方案。但我在许多不同的平台上工作,所以我想要一些便携的东西。到目前为止,我所看到的一切都是特定于平台的。
很多,非常感谢您的解决方案!
PS - 是的,我知道它仍然会被破解。我想提出一些合理的东西,作为一个用户,我仍然会发现友好。答案 0 :(得分:1)
不幸的是,没有。如果缩短,则会丢失信息,并且无法重新创建原始哈希值。
但是,您可以尝试以下几种方法:
答案 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哈希值,它可能就是您要查找的内容。