我愿意花一些时间为桌面Java应用程序开发另一个许可管理器。经过一些环顾四周,我发现Iakin JCPUID可以免费使用,并且应该可以在大多数操作系统中使用我发现here的本机库。
我的想法是做两个模块:主应用程序将显示带有CPU ID和验证文本字段的弹出窗口和密钥生成器应用程序。用户将CPU ID传递给keygen所有者,后者将向用户返回验证码(使用keygen生成)。用户提交正确的验证码后,将在文件系统中创建具有该代码的许可证文件。每次应用程序启动时,它都会检查该文件的存在性和正确性,然后加载主应用程序屏幕。
如何进行代码验证,我认为最好的选择是使用非对称加密技术,特别是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文件的格式?
答案 0 :(得分:1)
Java加密框架不支持OpenPGP。 X.509密钥(例如PKCS12格式)与OpenPGP不兼容 - 尽管它们(主要)依赖于(大部分)相同的加密算法。
使用X.509证书(您也可以为此目的创建自己的CA),或者依赖OpenPGP for Java的实现。在开源库方面,您可以通过BouncyCastle(LGPL)在本机Java实现GnuPG(MIT许可证)或接口Java GPGME binding(GPL)之间进行选择。
BouncyCastle可能是更好的方法,因为您需要做的就是添加另一个Java库,而不是在系统中安装另一个软件。