【发布时间】:2016-05-03 10:19:03
【问题描述】:
我愿意花一些时间为桌面 Java 应用程序开发另一个许可证管理器。环顾四周后,我发现了 Iakin 的 JCPUID,它可以免费使用,并且应该可以在大多数带有我发现 here 的本机库的操作系统上运行。
我的想法是做两个模块:将显示带有 CPU ID 和验证文本字段的弹出窗口的主应用程序和密钥生成器应用程序。用户将 CPU ID 传递给注册机所有者,注册机所有者将验证码(由注册机生成)返回给用户。用户提交正确的验证码后,将在文件系统中创建带有该验证码的许可证文件。应用程序每次启动时,都会检查该文件的存在和正确性,然后加载主应用程序屏幕。
关于代码验证,我认为最好的选择是使用非对称加密,尤其是 RSA。公钥将内置在应用程序中,秘密将内置在密钥生成器中。因此 CPUID 将被传递给密钥生成器所有者,然后使用 RSA 签名。该签名将被传回给用户,用户将使用内置公钥验证其有效性。
我使用 Kleopatra 和 gpg Linux 命令行工具本身生成了 gpg 密钥对。然后我尝试使用这种方法签署一些东西:
private byte[] createSignature(byte[] file) {
byte[] signature = null;
try {
java.security.KeyStore keyStoreFile = java.security.KeyStore
.getInstance("PKCS12");
keyStoreFile.load(getClass().getClassLoader().getResourceAsStream("/secret.asc"),
"******".toCharArray());
PrivateKey privateKey = (PrivateKey) keyStoreFile.getKey(
"My Name Here", "******".toCharArray());
Signature dsa = Signature.getInstance("SHA1withRSA");
dsa.initSign(privateKey);
dsa.update(file, 0, file.length);
signature = dsa.sign();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return signature;
}
但是privateKey初始化会抛出异常:
java.security.InvalidKeyException: Key must not be null
我猜是因为这里的实例格式错误:
java.security.KeyStore keyStoreFile = java.security.KeyStore
.getInstance("PKCS12");
我想知道:
这种方法到底有多好?
不同的 OpenPGP 密钥格式之间存在什么区别,在这种情况下哪种最适合使用?如何知道现有OpenPGP文件的格式?
【问题讨论】:
标签: java encryption rsa public-key openpgp