Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java代码中执行以下操作的等效openssl命令是/是什么_Java_Openssl - Fatal编程技术网

在Java代码中执行以下操作的等效openssl命令是/是什么

在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

嗨,我有下面的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代码段的输出相匹配。谢谢大家。