我正在尝试使用私钥对字符串消息签名,该私钥是使用here中的命令生成的。这是下面的代码,用于加载和签名消息。
private String signMessage(String message) throws Exception {
Signature rsa = Signature.getInstance("SHA1withRSA");
rsa.initSign(getPrivate(privateKeyPath));
rsa.update(message.getBytes());
return rsa.sign().toString();
}
public PrivateKey getPrivate(String filename) throws Exception {
byte[] keyBytes = Files.readAllBytes(new File(filename).toPath());
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(spec);
}
要弄清我提供的privatekeyPath类似于/path/test.der
。
但是,在尝试对消息签名时出现以下错误-java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
这是怎么了?为什么我似乎无法用私钥签名消息?有人可以指定一种可行的方法来完成此任务吗?
答案 0 :(得分:1)
您的getPrivate
方法似乎是正确的,所以我认为问题出在密钥的生成或格式上
der文件可以包含二进制形式的证书或私钥。对于pem文件,它们以base 64编码。通常您需要一个.key文件或一个.pem文件,其内容以-----BEGIN PRIVATE KEY-----
确保您使用的是包含der
键的二进制pkcs#8
格式,以便Java可以读取它。在此处查看完整的示例:https://stackoverflow.com/a/19387517/6371459
在您的代码rsa.sign().toString()
中出现错误,因为无法将二进制数组转换为字符串。您应该使用二进制数据或将其编码为以64为基数
请注意,在链接的问题中,签名以base64编码。您不需要这样做,因为您可以使用二进制数组。