java实现sha256电子签名_Java与PHP签名验签问题(SHA256 with RSA算法)
OpenJDK 12 、PHP 7.3 测试交叉验证都通过。
// 原文
$data = '二〇二〇年四月四日 01:43:37';
// 私钥
$private = <<
-----BEGIN RSA PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCow6pxwoAIFXWs
ZY3QMoUmB4uAYk0cAROITeCLROpzwRDtcXRDJ3TP/LrwgviTlmPD/VAtxa01eW7+
xmCUCY7IuaG9UmRAF7q8RXQ+T74ce8zSF6KIWRbWv+DOq860zCmaa9zr5DBHgf5X
mwC6/SqBhQlE7WxrecNOJC7Qx5o1V/LhZ5hAP5nxg6zpoSvTMZitiQSRVuenqotP
t0iD8b4TRcX7siNGIE2mo7xoCnjJ7Vv3iuLi6kczfpH5WoB/k54hZncZPc/wN4m4
SWY4f1uoDr2XtkCDNAODuhu7LMz1Yvk7yRsyX7NwopmLHzhtjdSOSPnJszTQUkNa
+8DCSxJhAgMBAAECggEAbxJgUoDdfPSKvw0Tmcw2P8JFeRi5gU3gChyfRWn1GHwf
5PZ/u1bzlZPTgUnhylj3jl1g8M8iYYhrmfj8RVJJDCjIn27jlh9IAnN/vycCi4Kb
Wka97RkdY/djQQJoiCu60exduU80y0tuF0Bn6amH2Tiy0g+lBNNdzEcaHMTR5HrN
PS7wRCnU0i3aIZbGSfFT6EHQES5FE2q3hTrySrv4cqR2Jnk+UJPYMyl7/cgc/X7K
1cHCVpHmahhgxzXK2KBoOs2fmLcpHvlxu8roJm2OWxUDAoZFKtP5W6j0lbIl3afb
OJFjpH1SLOP55lAMGAU65Ili68yVWWQuJi+h23dDcQKBgQDR4ZKK8AvsWHSHIcuh
6/bBkKSXCLatZhqXE5sjaQy1syzXtLQ1JDYilDgorpvmqOfwClScF/eQLTYO+qM5
zQEfZpMjciLiywAvRCRFKlUSOE4jivfsMZLsZ617QSUMrxXRKlUXNMOEDP/wE5p+
LiaxORGWMuKJYavfabnmeEnH3QKBgQDN2SblEQok5+Q6kx5twrIJUhKeexLwtDHV
ybObO95iYMTCjbfxxA48w7jmJl1cPADqNINeDPOHNIl16RQ4UHH6MO32FVoHlei9
AtVqKxCpBiJvl7T7vg0n8Zr3uCANVmexdsSnq6DbqTrXCPufo9vmfkScGjK3lmgA
xqyJUkouVQKBgGteobBQQ1lCm0JySJFqfI7jpz/Y5lNo05uMHSaNXEIsCnnDaRly
j/s6pkwxn3Ht4NHNByHfpPduGaSqFgzA0p00xXsxraUmQs7rZj63/FNY2KiYNGLx
rX8hPv+6APEvNNMPe/5mMMuCNwCjlrqMc6DgWB3lpDyx6dJebQr5aI1FAoGAJLrw
s8L8mmU+Vi1WKqOo/PzGEb1IPecJVWpuP+7I2akGsuhywBMJr1IFNhv2YLTcPO4t
2qRY9/Ep7f4u+3VvQQNmEpjwvZXEN6W/yvfwOxi7IEpjot/gnRYBXt5d6cNXMVVN
9dUsGMXzl9ckfvHQFSrGt0v9bMDLwgexVbd3QRkCgYEAzTVg+3hY9lt1cdrwklOs
Yfw3K33lq+Ip8RZ7WjeuO6W2Fuvh/MHEBxnwcPEZSKIhOpOV2VdYQo80uqinE4il
4IQqhf2qFOshGHrOspDbJUgtuVH5JkmQDeh5yT5+Upd3FXj8sOVjzbH2sz//o9sU
jOYUhzLO1jeLIc6l0wnzRfE=
-----END RSA PRIVATE KEY-----
PRI;
// 公钥
$public = <<
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqMOqccKACBV1rGWN0DKF
JgeLgGJNHAETiE3gi0Tqc8EQ7XF0Qyd0z/y68IL4k5Zjw/1QLcWtNXlu/sZglAmO
yLmhvVJkQBe6vEV0Pk++HHvM0heiiFkW1r/gzqvOtMwpmmvc6+QwR4H+V5sAuv0q
gYUJRO1sa3nDTiQu0MeaNVfy4WeYQD+Z8YOs6aEr0zGYrYkEkVbnp6qLT7dIg/G+
E0XF+7IjRiBNpqO8aAp4ye1b94ri4upHM36R+VqAf5OeIWZ3GT3P8DeJuElmOH9b
qA69l7ZAgzQDg7obuyzM9WL5O8kbMl+zcKKZix84bY3Ujkj5ybM00FJDWvvAwksS
YQIDAQAB
-----END PUBLIC KEY-----
PUB;
// JAVA 生成的签名
// 验证
//$encrypt = 'flCNTyn6pydpBy7zPuJ6zaIpVMz47RdhmqsFsdRgHZF79H78R9Hhkw5sf3T86f6ESDSCD+3Fj/JSHZE9+hXyUt4i6NH41MKBVLr8pgZBpkwExPcBXa13vSa2dFniDbu2ZHiKRJGZWtGTmQPOHAxOqfnNxEv0StP8Hit8Plva/ug7tdGCi4j6sjhTWpB2vUFI2tzSnbeOQWJ+dfa6zrwbIC8EHBYltUiRmMry3H7YYNI+rt16HvS7TrbVWPi90ClMdj64CEahlS9TLpzErMUuJcyubs12QLUhHKL9IMvqNMa8SF8eztp3ZmWTtC1YxFfSHhQBUiLV/bA+iJ7CYROwIw==';
//$verify = openssl_verify($data, base64_decode($encrypt), $public, OPENSSL_ALGO_SHA256);
//var_dump($verify);
//die;
//
生成签名去JAVA验证
//$isOK = openssl_sign($data, $sign, $private, OPENSSL_ALGO_SHA256);
//if ($isOK) {
// echo base64_encode($sign);
//}
package com.company;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class Main {
public static void main(String[] args) throws Exception {
String origin = "二〇二〇年四月四日 01:43:37";
String encrypt = "flCNTyn6pydpBy7zPuJ6zaIpVMz47RdhmqsFsdRgHZF79H78R9Hhkw5sf3T86f6ESDSCD+3Fj/JSHZE9+hXyUt4i6NH41MKBVLr8pgZBpkwExPcBXa13vSa2dFniDbu2ZHiKRJGZWtGTmQPOHAxOqfnNxEv0StP8Hit8Plva/ug7tdGCi4j6sjhTWpB2vUFI2tzSnbeOQWJ+dfa6zrwbIC8EHBYltUiRmMry3H7YYNI+rt16HvS7TrbVWPi90ClMdj64CEahlS9TLpzErMUuJcyubs12QLUhHKL9IMvqNMa8SF8eztp3ZmWTtC1YxFfSHhQBUiLV/bA+iJ7CYROwIw==";
if (verify(getPublic(), origin, encrypt)) {
System.out.println("验证通过!");
}
//
// System.out.println(signSHA256RSA(origin, getPrivate()));
}
private static String signSHA256RSA(String input, String strPk) throws Exception {
byte[] b1 = Base64.getDecoder().decode(strPk);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(b1);
KeyFactory kf = KeyFactory.getInstance("RSA");
Signature privateSignature = Signature.getInstance("SHA256withRSA");
privateSignature.initSign(kf.generatePrivate(spec));
privateSignature.update(input.getBytes(StandardCharsets.UTF_8));
byte[] s = privateSignature.sign();
return Base64.getEncoder().encodeToString(s);
}
private static boolean verify(String publicKeyStr, String originStr, String encrypted) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException {
byte[] decode = Base64.getDecoder().decode(encrypted);
byte[] data = originStr.getBytes();
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyStr));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
Signature sha256withRSA = Signature.getInstance("SHA256withRSA");
sha256withRSA.initVerify(publicKey);
sha256withRSA.update(data);
return sha256withRSA.verify(decode);
}
public static String getPrivate() {
return "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCow6pxwoAIFXWsZY3QMoUmB4uAYk0cAROITeCLROpzwRDtcXRDJ3TP/LrwgviTlmPD/VAtxa01eW7+xmCUCY7IuaG9UmRAF7q8RXQ+T74ce8zSF6KIWRbWv+DOq860zCmaa9zr5DBHgf5XmwC6/SqBhQlE7WxrecNOJC7Qx5o1V/LhZ5hAP5nxg6zpoSvTMZitiQSRVuenqotPt0iD8b4TRcX7siNGIE2mo7xoCnjJ7Vv3iuLi6kczfpH5WoB/k54hZncZPc/wN4m4SWY4f1uoDr2XtkCDNAODuhu7LMz1Yvk7yRsyX7NwopmLHzhtjdSOSPnJszTQUkNa+8DCSxJhAgMBAAECggEAbxJgUoDdfPSKvw0Tmcw2P8JFeRi5gU3gChyfRWn1GHwf5PZ/u1bzlZPTgUnhylj3jl1g8M8iYYhrmfj8RVJJDCjIn27jlh9IAnN/vycCi4KbWka97RkdY/djQQJoiCu60exduU80y0tuF0Bn6amH2Tiy0g+lBNNdzEcaHMTR5HrNPS7wRCnU0i3aIZbGSfFT6EHQES5FE2q3hTrySrv4cqR2Jnk+UJPYMyl7/cgc/X7K1cHCVpHmahhgxzXK2KBoOs2fmLcpHvlxu8roJm2OWxUDAoZFKtP5W6j0lbIl3afbOJFjpH1SLOP55lAMGAU65Ili68yVWWQuJi+h23dDcQKBgQDR4ZKK8AvsWHSHIcuh6/bBkKSXCLatZhqXE5sjaQy1syzXtLQ1JDYilDgorpvmqOfwClScF/eQLTYO+qM5zQEfZpMjciLiywAvRCRFKlUSOE4jivfsMZLsZ617QSUMrxXRKlUXNMOEDP/wE5p+LiaxORGWMuKJYavfabnmeEnH3QKBgQDN2SblEQok5+Q6kx5twrIJUhKeexLwtDHVybObO95iYMTCjbfxxA48w7jmJl1cPADqNINeDPOHNIl16RQ4UHH6MO32FVoHlei9AtVqKxCpBiJvl7T7vg0n8Zr3uCANVmexdsSnq6DbqTrXCPufo9vmfkScGjK3lmgAxqyJUkouVQKBgGteobBQQ1lCm0JySJFqfI7jpz/Y5lNo05uMHSaNXEIsCnnDaRlyj/s6pkwxn3Ht4NHNByHfpPduGaSqFgzA0p00xXsxraUmQs7rZj63/FNY2KiYNGLxrX8hPv+6APEvNNMPe/5mMMuCNwCjlrqMc6DgWB3lpDyx6dJebQr5aI1FAoGAJLrws8L8mmU+Vi1WKqOo/PzGEb1IPecJVWpuP+7I2akGsuhywBMJr1IFNhv2YLTcPO4t2qRY9/Ep7f4u+3VvQQNmEpjwvZXEN6W/yvfwOxi7IEpjot/gnRYBXt5d6cNXMVVN9dUsGMXzl9ckfvHQFSrGt0v9bMDLwgexVbd3QRkCgYEAzTVg+3hY9lt1cdrwklOsYfw3K33lq+Ip8RZ7WjeuO6W2Fuvh/MHEBxnwcPEZSKIhOpOV2VdYQo80uqinE4il4IQqhf2qFOshGHrOspDbJUgtuVH5JkmQDeh5yT5+Upd3FXj8sOVjzbH2sz//o9sUjOYUhzLO1jeLIc6l0wnzRfE=";
}
public static String getPublic() {
return "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqMOqccKACBV1rGWN0DKFJgeLgGJNHAETiE3gi0Tqc8EQ7XF0Qyd0z/y68IL4k5Zjw/1QLcWtNXlu/sZglAmOyLmhvVJkQBe6vEV0Pk++HHvM0heiiFkW1r/gzqvOtMwpmmvc6+QwR4H+V5sAuv0qgYUJRO1sa3nDTiQu0MeaNVfy4WeYQD+Z8YOs6aEr0zGYrYkEkVbnp6qLT7dIg/G+E0XF+7IjRiBNpqO8aAp4ye1b94ri4upHM36R+VqAf5OeIWZ3GT3P8DeJuElmOH9bqA69l7ZAgzQDg7obuyzM9WL5O8kbMl+zcKKZix84bY3Ujkj5ybM00FJDWvvAwksSYQIDAQAB";
}
}
java实现sha256电子签名_Java与PHP签名验签问题(SHA256 with RSA算法)相关推荐
- php sha256加密介绍,php SHA256WithRSA签名验签加密解密
使用: $pri_key ="": $pub_key = ""; $char = '方方块儿';//要加密的字符 $sign = $this->RsaEn ...
- 如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 三分割据纡筹策,万古云霄一羽毛. ...
- Java 实现 RSA 非对称加密算法-加解密和签名验签
1. 非对称加密算法简介 非对称加密算法又称现代加密算法,是计算机通信安全的基石,保证了加密数据不会被破解.与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(pr ...
- Windows gmssl生成SM2证书 + java bc库签名验签
Windows gmssl生成SM2证书 + java bc库签名验签 openssl生成SM2证书 1 生成密钥 gmssl ecparam -genkey -name sm2p256v1 -tex ...
- 【可食用】KeyTool生成KeyStore,证书、公钥、私钥文档JAVA生成,JAVA实现ECC签名验签
KeyTool生成KeyStore,证书.公钥.私钥文档JAVA生成,JAVA实现ECC签名验签 一.首先我们可以写个工具类生成密钥对.证书.公钥.私钥文本 jksAndCerGenerator.ja ...
- Java 实现RSA 签名/验签与加密解密
文章目录 一.前言 二.签名与验签 1.程序代码如下: 2.程序运行结果: 三.加密解密 1.添加加解密方法 2.程序运行结果 一.前言 RSA 算法相比于AES算法不同的是RSA的秘钥为不同的两个一 ...
- java 国密p7验签_go/Java 国密sm2签名验签
近期go项目对接第三方Java服务,第三方要求使用国密sm3/sm2算法进行数据签名验签,特记录go端开发注意事项 1 关于密钥对 密钥生成可以使用openssl库,openssl版本至少是1.1.1 ...
- golang RSA base64 加解密 签名验签
1.秘钥.加密/签名字符串加密的格式 目前主要见到有hex及base64 (1)hex 针对hex的加解密 import ("encoding/hex" ) hex.DecodeS ...
- 密码技术应用--RSA文件签名验签
记录一下对一些稍大文件进行RSA签名验签的实现,这里只列出了核心代码,其他不涉及的代码或者有任何疑问可以查看我之前写的密码技术专题博客 /* 函数名: rsaSignrsa 签名算法实现对文件的签名 ...
最新文章
- Flutter开发之《新锐专家之路:混合开发篇》笔记(55)
- Service group - get entity set
- 无线网络:家庭 WiFi 的安全隐患及实用的防范建议
- 产品原型制作_早期制作原型如何帮助您设计出色的数字产品
- jdk12源代码文件_JDK 11:轻松取出单文件Java源代码程序
- Linux内核crypto子系统的调用逻辑
- linux 自动补全快捷键,day4 Linux下的快捷键和基本命令
- hibernate Restrictions 用法
- python官方文档中文版下载,python官方手册中文pdf
- 软考论文-高项-进度管理、风险管理
- 如何制作音乐界面动效设计
- MATALB 卷积神经网络 图片二分类
- mysql 循环查询_mysql循环查询(mysql循环语句)
- 1月到12月 周一到周日 十二种颜色 用英语怎么说
- 2020.8.13 京东Android开发二面
- 举个栗子!Tableau 技巧(152):横向对比堆叠柱形图的各部分占比
- MySQL 中文字段排序问题(根据中文拼音排序)
- 关于重装vscode打不开的三种解决方法,亲测有用
- HTML中的大于号和小于号怎样用代码打出来?
- 云计算服务器和vps,云服务器和vps差别