2010-04-28 163 views
5

我一直在看这一整天。几个小时前我应该已经走开了;在这一点上,我可能会漏掉一些明显的东西。使用非对称加密生成合理长度的许可证密钥?

简短版本:有没有一种方法可以生成一个非对称加密散列并将其归结为合理数量的明确的,人类可读的字符?

龙版本:

我要生成的许可证密钥我的软件。我希望这些键具有合理的长度(25-36个字符),并且可以方便地读取和输入(避免模糊字符,例如数字0和大写字母O)。

终于 - 这似乎是踢球 - 我真的很喜欢使用非对称加密,使其更难以生成新的密钥。

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

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

我也看了一下CocoaFob,它确实生成了一个键,但是我想要把它作为一个文件传递,这是很长的。

fooled around with OpenSSL一段时间,但不能拿出任何合理的长度。

所以......我错过了一些明显的东西吗?有没有一种方法可以生成并将不对称加密的散列生成并合理化为合理数量的明确的,人类可读的字符?

我愿意购买解决方案。但是我在很多不同的平台上工作,所以我想要一些可移植的东西。到目前为止,我看过的所有内容都是平台特定的。

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

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

+0

答案似乎是:不,你不能。如果有人能证明我错了,我会留下这个问题,但从我能告诉它只需要很多字节来加密散列,就是这样。我最终使用CocoaFob,到目前为止没有人抱怨(荒谬)很长的许可证密钥。 – starkos 2010-06-18 22:47:52

+2

作为一个兴趣点:我的应用程序,不明原因,在不到24小时内被破解。但它要求可执行文件在他们的keygen工作之前进行修补(他们用自己的公钥替换掉我的公钥)。我可以轻松地打破每个新版本的补丁(只需将键盘洗牌),以便我可以忍受它。 – starkos 2010-06-18 22:50:07

+0

Base58编码消除了不明确的字符。 – zaph 2016-06-03 13:27:53

回答

1

不幸的是,没有。如果缩短了时间,则会丢失信息,并且无法重新创建原始散列。

然而,这里的一对夫妇的事情,你可以尝试:

  • 使用base32。将其映射到字母表中所有可用的不含糊的字母。 (0vsO等)
  • 使用DSA,它往往比RSA更紧凑。
  • 让您的输入较短(截断SHA1哈希值,或使用MD5代替,例如)可能使输出更短了。
+0

截断散列,然后使用较少的位进行加密,听起来像是一个很好的建议。 – starkos 2011-01-06 11:59:44

0

我会考虑MD5算法。它被广泛实施,并将生成一个32个字符的字母数字字符串,而不管输入大小。将算法应用于SHA1哈希,它可能是您要查找的内容。

+1

MD5只会在SHA1上保存四个字节,并且不管它是不是加密,只是一个散列。任何知道输入数据的人都可以生成自己的许可证密钥。通过添加私钥/公钥对,他们将无法在没有私钥的情况下创建新的许可证。 (他们仍然可以破解二元,但是这是一个不同的问题) – starkos 2010-04-28 01:20:41

0

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

+0

好的,但问题是“有没有办法......归结一个非对称加密哈希值。 – starkos 2010-06-18 22:40:07

+0

我不认为它很重要,你如何到达在字节/字符串处,不对称或不对称散列输出被设计为占用位空间,即:128位,160位等。您可以按原样或后处理它:截断它或无论如何你都可以将它烧掉,但是你将失去哈希的独特性和/或哈希的加密强度。一个简单的截断应该可以工作并且'足够好',在内部提供你可以计算满哈希与您开始用trucated部分比较之前 – andora 2010-06-19 15:12:38

+0

分发非对称密钥的哈希值是没有意义的。!你必须包括在客户端私钥来验证哈希我计算哈希值,然后将其加密,*那*是我的(长)许可证密钥。 – starkos 2010-06-21 14:07:05

0

我不会回答加密部分,但我已经开始做注册接口的事情是在接口被引发时检查剪贴板的文本。如果文字是出现在剪贴板,扫描,以查看用户是否已经从地方复制他们的注册信息(电子邮件,网页等),如果你发现信息可能是你的注册信息/键,预 - 用它来填充注册界面。

它也表明,表明信息已成功从剪贴板刮接口上的一个小警告一个好主意(或不!)只是让用户知道什么做了或没发生。

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生成较短的签名。