2

我公司创建和销售的商业软件目前使用 Base-64 编码的 RSA 加密许可证密钥。结果大约有 90 个字符长。使用起来笨重且笨拙,并且容易出现用户错误。有些用户不太了解复制和粘贴,并尝试手动键入密钥。

我想用一种创建较小密钥的方法替换当前算法,例如我看到其他一些程序使用的 30 个字符的密钥。此外,我注意到许多软件供应商使用仅使用数字和大写字符的密钥,这使得它们使用起来更加方便。

我可以使用什么算法来生成嵌入用户名、产品 ID 和版本号的安全密钥,其中生成的许可证密钥不超过 30 个字符并且仅使用数字和大写字符?

(如果重要的话,我们正在使用 Java 进行编码。)

所以......这是一个开始:

public String createLicenseKey(String customerName, String productId, String versionNumber) {
    // what goes here?
    return licenseKey;
}

String key = createLicenseKey("Max Headroom", "ABCD", "4");
// key should now be in format AAAAAA-AAAAAA-AAAAAA-AAAAAA-AAAAAA
4

2 回答 2

3

我按照 fcm 的回答中提到的链接进行操作,这让我想到了一种可能性。您需要在 Java 类路径中使用 Google 的 Guava 库:

import com.google.common.hash.HashCode;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;

public class ScratchSpace {

    public static void main(String[] args) {
        String userName = "Max Headroom";
        String productKey = "ABCD";
        String versionNumber = "4";

        final String licenseKey = createLicenseKey(userName, productKey, versionNumber);
        System.out.println("licenseKey = " + licenseKey);

    }

    public static String createLicenseKey(String userName, String productKey, String versionNumber) {
        final String s = userName + "|" + productKey + "|" + versionNumber;
        final HashFunction hashFunction = Hashing.sha1();
        final HashCode hashCode = hashFunction.hashString(s);
        final String upper = hashCode.toString().toUpperCase();
        return group(upper);
    }

    private static String group(String s) {
        String result = "";
        for (int i=0; i < s.length(); i++) {
            if (i%6==0 && i > 0) {
                result += '-';
            }
            result += s.charAt(i);
        }
        return result;
    }

}
于 2013-03-26T13:14:44.790 回答
1

对于如此具体的事情,您可能必须生成自己的算法,以只有您的软件会“理解”的方式将所需信息包含到哈希中。

获取信息(用户名、ID、版本),为其添加秘密盐,以增加额外的安全层。

到目前为止,您对代码的想法是正确的,但是在特定键方面并没有太多的固定。

查看类似的问题,例如thisthis,以获取有关该主题的更多信息。

于 2013-03-26T12:57:21.293 回答