【问题标题】:Generating serial or hex code for product licensing为产品许可生成序列号或十六进制代码
【发布时间】:2013-08-02 15:42:34
【问题描述】:

有没有办法生成类似的串行/十六进制代码:xxxx-xxxx-xxxx-xxxx-xxxx-xxxx 使用java api?当产品破译它应该能够提取的代码时

  1. 姓名
  2. 有效期
  3. Mac 地址
  4. 其他信息

将根据上述因素生成代码。我尝试使用私钥/公钥RSA/ECB/PKCS1Padding。然后转成HEX,但是需要4096的私钥sixe,生成的hex代码太长!

public class ProductKeyGenerator {
private static final String transformation = "RSA/ECB/PKCS1Padding";

public static void main(String[] args) {
    String cleartext = "CN=CompanyName;mac=some mac;@host=somehost;email=admin@somedomain.com;issued=01/01/20013;expire=12/12/2013";
    ProductKeyGenerator pgen = new ProductKeyGenerator();
    String productKey = pgen.generate(cleartext);
    System.out.println(productKey);
}

   ...
   ...
   ...
String generate(String data) {
    //encrypted hex
    String hexEnc = null;
    try {
        //--sign
        String signature = sign(data);
        data += ";sign=" + signature;

        byte[] dataBytes = data.getBytes("utf-8");
        //encrypt
        byte[] encBytes = encrypt(dataBytes);
        hexEnc = Hex.encodeHexString(encBytes);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return hexEnc;
}

String sign(String text) {
    String signed = null;
    try {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        byte[] data = text.getBytes("utf-8");
        byte[] digitalSignature = signData(data);
        signed = Hex.encodeHexString(digitalSignature);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return signed;
}
   ...
   ...
   ...

   }

【问题讨论】:

  • 您想要的序列号的最大长度是多少?

标签: java security encryption code-access-security


【解决方案1】:

使用自定义数据,您无法创建固定长度的序列号。但是您可以将序列号与信息相关联,例如在数据库中。简单的序列号生成器:

String serial = UUID.randomUUID().toString().toUpperCase();
System.out.println(serial);

PS:在序列号中使用mac地址是非常不安全的。很容易改变。

【讨论】:

  • 为什么不能创建一个固定长度的序列号?当然,如果有完全不相关的数据并尝试将它们组合在一起,您可能会遇到麻烦,但如果数据相关,我不明白为什么会永远能够想出一个固定的长度序列。尽量不要说太笼统(“不能创造”),你几乎总是错的。
  • 最好在any上的数据库中存储一个序列号。
  • 我喜欢使用 UUID 的想法,UUID uuid = UUID.nameUUIDFromBytes(cleartext.getBytes("UTF-8"));但是现在,donet 上有什么东西可以为给定的文本生成相同的 UUID 吗?我已经发布了另一个 [stackoverflow.com/questions/18021808/…
  • UUID.nameUUIDFromBytes(byte[]) 不允许您从 UUID 中提取信息(这是一种单向功能)。这不是要求吗? (你的问题说是)。
  • @AndreyRedov 感谢您提供起点。用户 Syon 从 dotnet 方面得到了很大的帮助。
猜你喜欢
  • 2019-01-01
  • 2017-06-28
  • 2018-10-13
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2012-11-30
  • 2023-03-09
相关资源
最近更新 更多