为什么Java密钥库在加载OpenPGP密钥时失败?
我愿意花一些时间为桌面Java应用程序开发另一个许可证管理器。环顾四周后,我发现Iakin可以免费使用,并且可以在我发现的大多数带有本机libs的操作系统上使用 我的想法是做两个模块:主应用程序将显示带有CPU ID和验证文本字段的弹出窗口,以及密钥生成器应用程序。用户将CPU ID传递给keygen所有者,后者将验证码(使用keygen生成)返回给用户。用户提交正确的验证代码后,将在文件系统中创建带有该代码的许可证文件。每次应用程序启动时,它都会检查该文件的存在性和正确性,然后加载主应用程序屏幕 关于代码验证,我认为最好的选择是使用非对称加密,特别是RSA。公钥将内置于应用程序中,而机密将内置于密钥生成器中。所以CPUID将被传递给密钥生成器所有者,然后用RSA签名。该签名将被传输回用户,用户将使用内置公钥验证其有效性 我使用Kleopatra和gpglinux命令行工具本身生成了gpg密钥对。然后我试着用这个方法签了一些东西:为什么Java密钥库在加载OpenPGP密钥时失败?,java,encryption,rsa,public-key,openpgp,Java,Encryption,Rsa,Public Key,Openpgp,我愿意花一些时间为桌面Java应用程序开发另一个许可证管理器。环顾四周后,我发现Iakin可以免费使用,并且可以在我发现的大多数带有本机libs的操作系统上使用 我的想法是做两个模块:主应用程序将显示带有CPU ID和验证文本字段的弹出窗口,以及密钥生成器应用程序。用户将CPU ID传递给keygen所有者,后者将验证码(使用keygen生成)返回给用户。用户提交正确的验证代码后,将在文件系统中创建带有该代码的许可证文件。每次应用程序启动时,它都会检查该文件的存在性和正确性,然后加载主应用程序屏
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");
我想知道:
Java加密框架不支持OpenPGP。例如,PKCS12格式的X.509密钥与OpenPGP不兼容——尽管它们(主要)依赖于相同的加密算法 要么使用X.509证书(您也可以为此创建自己的CA),要么依赖OpenPGP for Java的实现。就开源库而言,您可以选择本机Java实现(MIT许可证)或通过(LGPL)的接口(GPL) BouncyCastle可能是更好的方法,因为您需要做的只是添加另一个Java库,而不是在系统中安装另一个软件