Java相当于“openssl -dgst -sha512 -sign keyfile -out outfile file”

时间:2017-01-25 11:52:26

标签: java bouncycastle

我的同事在Java中实现上述问题时遇到了问题。他们已经浪费了几天。

该命令有什么作用?创建摘要,然后使用密钥文件对摘要进行签名?

创建摘要的说明如下:How can I create an SHA512 digest string in Java using bouncy castle? 我如何登录Java?

-sign使用哪种算法?它取决于我使用的密钥吗? 我的密钥文件是p12格式。这是对的吗?

1 个答案:

答案 0 :(得分:1)

根据您的密钥类型和摘要算法,openssl将确定签名算法。见OpenSSL documentation

  

签署文件时,dgst将根据私钥的ASN.1信息自动确定用于签名的算法(RSA,ECC等)。

要在Java中执行相同的过程,您必须加载PKCS12密钥库的密钥并使用私钥进行签名。 Bouncycastle不需要

//Read private key identified by keyAlias from keystore
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(Files.readAllBytes(Paths.get("keyfile.p12")), password);
PrivateKey key = (PrivateKey)keystore.getKey(keyAlias, password);

//Use SHA512withRSA with RSA keys, SHA512withDSA for DSA keys,...
//See supported algorithm here: https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Signature
String signatureAlgorithm = "SHA512withRSA";

//Digital Signature
Signature sig = Signature.getInstance(signatureAlgorithm); 
sig.initSign(privateKey);
sig.update(Files.readAllBytes(Paths.get(file)));
byte[] signature = sig.sign();

OpenSSL默认生成HEX输出。使用-binary获取二进制数据或将Java输出转换为HEX