代码之家  ›  专栏  ›  技术社区  ›  J. Perkins

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

  •  6
  • J. Perkins  · 技术社区  · 16 年前

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

    我想为我的软件生成许可证密钥。我希望这些钥匙是一个合理的长度(25-36个字符),并易于阅读和输入的人(所以避免像数字0和大写字母O含糊不清的字符)。

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

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

    我还研究了CocoaFob,它确实生成了一个密钥,但是它太长了,所以我还是希望将它作为一个文件传递。

    fooled around with OpenSSL

    那么…我是不是漏掉了什么明显的东西?有没有一种方法可以生成一个非对称加密的散列,并将其归结为合理数量的清晰易读的字符?

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

    是的,我知道它还是会裂开的。我正试图想出一些合理的东西,作为一个用户,我仍然会觉得友好。

    5 回复  |  直到 16 年前
        1
  •  1
  •   Kenneth Ballenegger    15 年前

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

    不过,您可以尝试以下几点:

    • 使用base32。将它映射到字母表中所有不含糊的可用字母(0vsO等)
    • 使用DSA,它往往比RSA更紧凑。
    • 缩短输入(例如,截断sha1散列或使用md5)也可能缩短输出。
        2
  •  0
  •   Ashish Chaurasia    16 年前

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

        3
  •  0
  •   bensiu CandorZ    13 年前

    我不会回答加密部分,但我已经开始做的事情注册接口是检查文本剪贴板时,接口提出。如果剪贴板上有文本,请扫描它以查看用户是否从某处(电子邮件、网页等)复制了注册信息,以及是否找到 能够 作为您的注册信息/密钥,使用它预填充注册界面。

        4
  •  0
  •   pedroapero    10 年前

    目前,创建短许可证密钥的最佳基于签名的方法似乎是 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生成更短的签名。

        5
  •  -1
  •   Kai    16 年前

    推荐文章