我想用Java生成一个RSA-SHA256签名,但我不能让它在控制台上生成与OpenSSL相同的签名.
这就是我对OpenSSL所做的事情(遵循本教程):
生成密钥对:
openssl genrsa -out private.pem 1024
Run Code Online (Sandbox Code Playgroud)
提取公钥:
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
Run Code Online (Sandbox Code Playgroud)
创建数据哈希:
echo 'data to sign' > data.txt
openssl dgst -sha256 < data.txt > hash
Run Code Online (Sandbox Code Playgroud)
生成的哈希文件以(stdin)=我手工删除的内容开头(首先忘了提及它,谢谢马塔).
签名哈希:
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > signature
Run Code Online (Sandbox Code Playgroud)
要在Java中重现结果,我首先将私钥从PEM转换为DER:
openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -nocrypt > private.der
Run Code Online (Sandbox Code Playgroud)
现在我编写了这个Java类来生成相同的签名:
public class RSATest {
public static void main(String[] args) throws IOException,
NoSuchAlgorithmException, InvalidKeySpecException,
InvalidKeyException, SignatureException {
byte[] …Run Code Online (Sandbox Code Playgroud) 嗨,我已生成密钥对,并使用私钥生成签名.
openssl rsautl -sign -in helloworld.txt -inkey aa.pem -out sig
Run Code Online (Sandbox Code Playgroud)
但是,我无法使用我的公钥验证签名:
openssl rsautl -verify -in helloworld.txt -inkey aa.pub -sigfile sig
Run Code Online (Sandbox Code Playgroud)
我知道-sigfile已被弃用.openssl.org的一些在线文档是错误的.
什么命令我应该使用我的公钥来验证信号?
以下命令为输入文件生成签名:
openssl dgst -sha1 -sign privateKey.pem -out signature1 someInputFile
Run Code Online (Sandbox Code Playgroud)
以下命令还会为输入文件生成签名:
openssl dgst -binary -sha1 someInputFile > digest
openssl rsautl -sign -in digest -inkey privateKey.pem -out signature2
Run Code Online (Sandbox Code Playgroud)
据我所知,他们都应该创建文件的SHA1摘要的RSA签名.但它们不会生成相同的签名.
结果,用方法2生成的签名也不能通过openssl dgst -verify调用来验证.
有人知道区别是什么,以及如何克服这种差异?