You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

支付API签名需求:如何将Java的SHA512withRSA字符串签名逻辑转换为OpenSSL实现?

如何用OpenSSL实现Java的SHA512withRSA签名?

我来帮你把Java里的SHA512withRSA签名逻辑对应到OpenSSL的操作上——其实这两者底层逻辑完全一致,只是工具不同而已。

先拆解下Java代码里的SHA512withRSA到底做了什么:它是先对原始字符串做SHA-512哈希,再用RSA私钥对哈希值做PKCS#1 v1.5格式的填充签名,最后把二进制签名结果转成Base64。这正好是OpenSSL默认支持的RSA签名模式,不用额外配置。

完整流程命令(一步到位)

如果你想直接从原始载荷字符串完成整个签名流程(包括哈希、签名、Base64编码),可以用这条命令:

# 假设你的载荷存在payload.txt文件里,私钥是private_key.pem
openssl dgst -sha512 -sign private_key.pem payload.txt | openssl base64 -A

参数解释:

  • -sha512:指定用SHA-512哈希算法,和Java里的MessageDigest.getInstance("SHA-512")对应
  • -sign private_key.pem:用你的RSA私钥对哈希值做签名,默认就是PKCS#1 v1.5填充,完美匹配Java的SHA512withRSA
  • openssl base64 -A:把二进制签名结果转成单行的Base64字符串,和Java的Base64.getEncoder().encodeToString()输出格式一致(不加-A会输出多行,大部分API也接受,但单行更符合常见请求格式)

单独完成签名步骤(如果你已经做好SHA-512哈希)

如果你已经按步骤1生成了SHA-512的哈希二进制文件(比如hash.bin),可以单独执行签名+Base64编码:

openssl rsautl -sign -inkey private_key.pem -in hash.bin -out signature.bin && openssl base64 -in signature.bin -out signature.b64

这里的rsautl -sign是专门用RSA私钥做签名的命令,默认填充方式和Java的SHA512withRSA完全一致。

几个注意事项

  • 私钥格式:不管你的私钥是Java常用的PKCS#8格式,还是OpenSSL常见的PKCS#1格式,OpenSSL都能直接识别,不需要转换
  • 字符编码:确保原始载荷字符串是UTF-8编码(和Java代码里的getBytes(StandardCharsets.UTF_8)保持一致),如果是文件,保存时要选UTF-8无BOM格式
  • 验证签名(可选):如果要确认签名是否正确,可以用对应的公钥验证:
openssl dgst -sha512 -verify public_key.pem -signature signature.bin payload.txt

验证通过会输出Verified OK。

内容的提问来源于stack exchange,提问作者Jensd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:47:32