在Java代码中执行以下操作的等效openssl命令是/是什么
嗨,我有下面的java代码在Java代码中执行以下操作的等效openssl命令是/是什么,java,openssl,Java,Openssl,嗨,我有下面的java代码 Openssl命令等效于什么。我希望能够从OS命令行运行 这就是我认为openssl命令等效的东西。。。但我不能完全肯定 openssl dgst-sha256-sign my_private.key-out/tmp/sign.sha256 codeTosign.txt 当我尝试两者并比较它们时 sign.sha256 与来自 System.out.println(“Signature=“+base64Signature”) 他们不相等/不匹配 import java
Openssl命令等效于什么。我希望能够从OS命令行运行 这就是我认为openssl命令等效的东西。。。但我不能完全肯定 openssl dgst-sha256-sign my_private.key-out/tmp/sign.sha256 codeTosign.txt 当我尝试两者并比较它们时 sign.sha256 与来自 System.out.println(“Signature=“+base64Signature”) 他们不相等/不匹配
import java.security.KeyFactory;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
public class SHA256RSA {
public static void main(String[] args) throws Exception {
String input = "sample input";
// Not a real private key! Replace with your private key!
String strPk = "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9"
+ "w0BAQEFAASCBKkwggSlAgEAAoIBAQDJUGqaRB11KjxQ\nKHDeG"
+ "........................................................"
+ "Ldt0hAPNl4QKYWCfJm\nNf7Afqaa/RZq0+y/36v83NGENQ==\n"
+ "-----END PRIVATE KEY-----\n";
String base64Signature = signSHA256RSA(input,strPk);
System.out.println("Signature="+base64Signature);
}
// Create base64 encoded signature using SHA256/RSA.
private static String signSHA256RSA(String input, String strPk) throws Exception {
// Remove markers and new line characters in private key
String realPK = strPk.replaceAll("-----END PRIVATE KEY-----", "")
.replaceAll("-----BEGIN PRIVATE KEY-----", "")
.replaceAll("\n", "");
byte[] b1 = Base64.getDecoder().decode(realPK);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(b1);
KeyFactory kf = KeyFactory.getInstance("RSA");
Signature privateSignature = Signature.getInstance("SHA256withRSA");
privateSignature.initSign(kf.generatePrivate(spec));
privateSignature.update(input.getBytes("UTF-8"));
byte[] s = privateSignature.sign();
return Base64.getEncoder().encodeToString(s);
}
}
参考资料:除了输入的不同(内存中的变量与文件内容,我假设您做的完全相同),Java代码base64对结果进行编码(并在前面粘贴
Signature=
),但openssl dgst-sign
没有
最简单的方法是让Java编写二进制文件(不进行编码),但随后必须用二进制文件进行比较,例如Unix上的cmp
,Windows上的fc/b
;视觉或文本模式的比较不会给出可靠的结果
您可以改为对OpenSSL输出进行base64编码,但要小心:有许多base64编码方案,它们通常会产生类似但不完全相同的输出,因此即使签名相同,输出也可能不相等(见下文)。特别是,如果Base64
是Java8+java.util.Base64
,则默认的“基本”编码器使用经典的PEM/MIME字母表和无行终止符。如果将openssl dgst-sign
的输出通过管道传输到openssl base64
中,则默认为相同的字母表,但每64个字符使用一行终止符。如果使用opensslbase64-A
,则应抑制行终止符。如果您的系统上有其他base64编码程序,则它们(每个)的行为可能不同。如果您确实希望前面有签名=
,请使用任何适当的文本操作程序,如sed awk perl
或Unix上的大多数shell
旁白:您不应该假设您可以通过将签名与新生成的签名进行比较来验证签名。这里使用的方案RSASSA-PKCS1-v1_5又名“classic type 01”,恰好是确定性的,并且比较恰好起作用,但许多其他数字签名方案是不确定性的。验证签名的正确方法是应用签名方案定义的验证过程。例如,Java
Signature.initVerify(publikeyobj)、update(databuf)、verify(signaturebuf)
或OpenSSL命令行dgst-$hash感谢大家的帮助。
最后我遇到的最大问题是复制粘贴的字符串
“示例输入”它附加了一个“\n”。
当这个被移除的时候。openssl命令的输出与java代码段的输出相匹配
谢谢大家。您正在显示openssl
命令,同时请求openssl
命令。命令以什么方式不起作用?我希望能够从linux命令行运行。不是从java应用程序内部。因此,请运行您显示的openssl
命令。当我同时执行这两个命令时,“s”的内容与/tmp/sign.sha256不匹配。或者它们的格式不对?然后编辑问题并说出问题所在。在我的第一个评论中,我问你“命令以什么方式不起作用?”因为问题文本没有提到这一点。谢谢大家的帮助。最后我遇到的最终问题是,当我复制粘贴的字符串“sample input”时,它会附加一个“\n”。当这个被移除的时候。openssl命令的输出与java代码段的输出相匹配。谢谢大家。