我正在尝试使用使用此处的命令生成的私钥对字符串消息进行签名。这是下面的代码,用于加载和签名消息。
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
怎么了 为什么我似乎无法用私钥签名消息?有人可以指定一种完成此工作的方法吗?
看来您的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编码。您不需要这样做,因为您可以使用二进制数组。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句