将 openssl 摘要签名语句转换为 Java 代码
Converting openssl digest signing statement to Java code
我正在尝试将 OpenSSL linux 语句转换为 Java 代码,但到目前为止,我得到了不同的结果。这是关于以下声明:
echo "testString" | openssl dgst -sha256 -sign private.key -passin "pass:passw0rd" | openssl base64 -A
此回显结果如下:
6FFS+Vym+Su887Mq0YG1OsURb7Csw9czvycShEd2P6SHQYKE7O6V/wzi5XTGJcP/sTaHvOAIZ5g8cIs5SEKD8NGaMLPD35hnNAn1nlAVfBT826pwIjUvzJII7d2aHKTjVfIhsyUEXbRtSMrrJNrtfyCTYYYOxCWzZv0RiOczQlpy1Jaa46fSacvaRKXi9xV/W1KxYcNS8wc/mc3Ujeqc4gfESb2YJU8yP3P269iENCjDq++8CTyEj4vm4XxlXYBIREEK7qUfxTTo1+XKfBck/0/RGwZD26jhRNHKMI6maW0mB+fRLjnYIvBqQKRbZnoIEmjy8AYy8CGC56Ujh2r3dg==
现在我正在尝试以下 Java 代码:
public String encryptString(byte[] data) {
try {
java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Resource keyStore = ctx.getResource(keystoreLocation);
PrivateKey privateKey = loadPrivateKey(keyStore.getInputStream());
Signature signature = Signature.getInstance("SHA256withRSA", "BC");
signature.initSign(privateKey);
signature.update(data);
String result = Base64.getEncoder().encodeToString(signature.sign());
// return Base64.getEncoder().encodeToString(signature.sign());
return null;
} catch (Exception e) {
log.error("Something went wrong during encryption.");
throw new RuntimeException(e);
}
}
此代码以不同于 linux 语句的编码结果结束:
uxdvp2oTaoS/Iln9KYNL+2o49fbW2Br0jIt9cc/F3xRm3XnsEVVBzKA0vL9yMCAvNvH0nfBt2nRHQzL5PtN+uLy0pKCtHBKxfgdTZjnhm0qdj6tcOIvx3f1AkrMhXAk6bfEMqxu5dEl8AJ2wvYvggyBDXn+Bv0TG+2iavNZ80RDqILExQvGSnD7O9BSPtOVtf17ahyzagYNiqEGxdqLUSZHNNs7Q10hYpeJ7cB6Jg/NRUGFS5Z14xmvjqyk63VFXw86hCvX1rnDt3vL7XRdSRKMhiI9SfnSHbNSNEMcSBRxX6nb1nkuuqjjzNBXZAduNAOBzIrrROmwQkXVOFKXDCw==
我还尝试了一些其他的东西。我尝试使用 Cipher 实现:
Cipher cipher = Cipher.getInstance("RSA/None/NoPadding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] hash = digest.digest(data);
byte[] signature = cipher.doFinal(hash);
String hashEncoded = Base64.getEncoder().encodeToString(hash);
String signatureEncoded = Base64.getEncoder().encodeToString(hash);
但是所有字符串最终都比预期的要短。我还看到了 'dgst' 语句,所以我想知道我必须消化消息(使用 MessageDigest digest = MessageDigest.getInstance("SHA-256", "BC");
),但在这里我遇到了同样的问题,字符串更短。
有人知道我做错了什么吗?
这里的问题很简单,也不是特别有趣。 echo "testString"
将换行符附加到正在回显的字符串。对于大多数版本的 echo,-n
选项将取消换行。或者,同样好,您可以在 java 版本中添加换行符,例如:
signature.update("testString\n".getBytes(StandardCharsets.UTF_8));
我正在尝试将 OpenSSL linux 语句转换为 Java 代码,但到目前为止,我得到了不同的结果。这是关于以下声明:
echo "testString" | openssl dgst -sha256 -sign private.key -passin "pass:passw0rd" | openssl base64 -A
此回显结果如下:
6FFS+Vym+Su887Mq0YG1OsURb7Csw9czvycShEd2P6SHQYKE7O6V/wzi5XTGJcP/sTaHvOAIZ5g8cIs5SEKD8NGaMLPD35hnNAn1nlAVfBT826pwIjUvzJII7d2aHKTjVfIhsyUEXbRtSMrrJNrtfyCTYYYOxCWzZv0RiOczQlpy1Jaa46fSacvaRKXi9xV/W1KxYcNS8wc/mc3Ujeqc4gfESb2YJU8yP3P269iENCjDq++8CTyEj4vm4XxlXYBIREEK7qUfxTTo1+XKfBck/0/RGwZD26jhRNHKMI6maW0mB+fRLjnYIvBqQKRbZnoIEmjy8AYy8CGC56Ujh2r3dg==
现在我正在尝试以下 Java 代码:
public String encryptString(byte[] data) {
try {
java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Resource keyStore = ctx.getResource(keystoreLocation);
PrivateKey privateKey = loadPrivateKey(keyStore.getInputStream());
Signature signature = Signature.getInstance("SHA256withRSA", "BC");
signature.initSign(privateKey);
signature.update(data);
String result = Base64.getEncoder().encodeToString(signature.sign());
// return Base64.getEncoder().encodeToString(signature.sign());
return null;
} catch (Exception e) {
log.error("Something went wrong during encryption.");
throw new RuntimeException(e);
}
}
此代码以不同于 linux 语句的编码结果结束:
uxdvp2oTaoS/Iln9KYNL+2o49fbW2Br0jIt9cc/F3xRm3XnsEVVBzKA0vL9yMCAvNvH0nfBt2nRHQzL5PtN+uLy0pKCtHBKxfgdTZjnhm0qdj6tcOIvx3f1AkrMhXAk6bfEMqxu5dEl8AJ2wvYvggyBDXn+Bv0TG+2iavNZ80RDqILExQvGSnD7O9BSPtOVtf17ahyzagYNiqEGxdqLUSZHNNs7Q10hYpeJ7cB6Jg/NRUGFS5Z14xmvjqyk63VFXw86hCvX1rnDt3vL7XRdSRKMhiI9SfnSHbNSNEMcSBRxX6nb1nkuuqjjzNBXZAduNAOBzIrrROmwQkXVOFKXDCw==
我还尝试了一些其他的东西。我尝试使用 Cipher 实现:
Cipher cipher = Cipher.getInstance("RSA/None/NoPadding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] hash = digest.digest(data);
byte[] signature = cipher.doFinal(hash);
String hashEncoded = Base64.getEncoder().encodeToString(hash);
String signatureEncoded = Base64.getEncoder().encodeToString(hash);
但是所有字符串最终都比预期的要短。我还看到了 'dgst' 语句,所以我想知道我必须消化消息(使用 MessageDigest digest = MessageDigest.getInstance("SHA-256", "BC");
),但在这里我遇到了同样的问题,字符串更短。
有人知道我做错了什么吗?
这里的问题很简单,也不是特别有趣。 echo "testString"
将换行符附加到正在回显的字符串。对于大多数版本的 echo,-n
选项将取消换行。或者,同样好,您可以在 java 版本中添加换行符,例如:
signature.update("testString\n".getBytes(StandardCharsets.UTF_8));