Java RSA私钥在Eclipse和命令行中有所不同
我在使用私钥对数据进行签名以及稍后使用公钥对其进行验证时遇到一些问题 我已经生成了私钥/公钥对,并将每个密钥保存在一个文件中。首先,我创建要签名的数据哈希:Java RSA私钥在Eclipse和命令行中有所不同,java,security,Java,Security,我在使用私钥对数据进行签名以及稍后使用公钥对其进行验证时遇到一些问题 我已经生成了私钥/公钥对,并将每个密钥保存在一个文件中。首先,我创建要签名的数据哈希: byte[] digest = MessageDigest.getInstance("SHA-1").digest(password); SecretKey secretKey = new SecretKeySpec(Arrays.copyOf(digest, 16), "AES"); Cipher cipher = Cipher.get
byte[] digest = MessageDigest.getInstance("SHA-1").digest(password);
SecretKey secretKey = new SecretKeySpec(Arrays.copyOf(digest, 16), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return cipher.doFinal(serializeLicense(data));
之后,我使用私钥对数据进行签名:
PrivateKey key = loadPrivateKey();
Signature dsa = Signature.getInstance("SHA1withRSA", "BC");
dsa.initSign(key);
dsa.update(data);
return dsa.sign();
我的问题是,这段代码似乎给出了不同的输出。当我在eclipse中运行它时,我可以用公钥验证生成的签名数据。但是,当我通过命令行运行代码时,签名的数据无法验证
进一步的分析表明,loadPrivateKey()方法是问题所在:
PrivateKey privateKey = null;
try
{
InputStream in = getClass().getClassLoader().getResourceAsStream("keys/rsa_key");
byte[] encodedPrivateKey = new byte[in.available()];
in.read(encodedPrivateKey);
in.close();
LOG.info(new String(Base64.getEncoder().encode(encodedPrivateKey), "UTF-8"));
privateKey = toPrivateKey(encodedPrivateKey);
}
catch (IOException ex)
{
LOG.error("private key not found", ex);
}
return privateKey;
encodedPrivateKey的日志记录提供了在eclipse中运行和在命令行上运行之间的最小差异输出。除了最后7个字符外,钥匙是相同的。这种差异从何而来?可能是不同的Java版本?检查您在Eclipse中使用的JRE,然后在命令行上运行
java-version
。不,两者都是1.8.0\u 60 64位。首先,永远不要使用available()
。您假设它返回文件的大小,但它不能保证这样做。您可以检查eclipse和命令行是否以不同长度的encodedPrivateKey
数组结束。这是代码中最明显的错误。