【发布时间】:2019-07-06 17:48:36
【问题描述】:
我正在尝试使用我使用来自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
这里有什么问题?为什么我似乎无法使用私钥签署消息?有人可以指定一种工作方式来完成这项工作吗?
【问题讨论】:
-
您还有其他问题,
rsa.sign().toString();将返回一个数组引用,而不是任何签名。您需要对结果进行编码以获得有效的字符串 (stackoverflow.com/questions/13109588/encoding-as-base64-in-java/…) -
很抱歉,我误读了您的问题并将
der与cer混淆了。 der 文件可以包含二进制证书或私钥。在 pem 文件的情况下,它们以 base 64 编码。在此处查看完整示例 stackoverflow.com/questions/11410770/… -
看来你的getPrivate方法是正确的,所以我猜问题出在私钥的生成或格式上。是这样的吗?
-
Signature.verify(signature[])只有一个参数。消息设置为Signature.update(message[]),公钥设置为Signature.initVerify(pubKey) -
好吧,我没听懂你的意思。第二个参数是签名。在您的问题中,这将是
rsa.sign()的结果。请注意,在链接的问题中,签名以 base64 编码。您不需要这样做,因为您可以使用二进制数组。在您的代码中,rsa.sign().toString()是一个错误,因为二进制数组无法转换为字符串。您应该使用二进制数据或将其编码为 base 64
标签: java openssl digital-signature