JAVA RSA 私钥签名 公钥验证签名 公钥验签
JAVA RSA 私钥签名 公钥验证签名 公钥验签
1.待签名字符串转为byte数组时,一般使用UTF8。
2.将私钥字符串(PKCS8格式)转为PKCS8EncodedKeySpec对象。
3.使用Signature对象的 update+sign 方法算出签名值,结果为byte数组。
4.签名值是byte数组,不便于传输,一般是转为BASE64字符串来传输。
5.公钥字符串转为X509EncodedKeySpec对象,Signature.update+Signature.verify 验证签名。
6.openssl生成的私钥默认是PKCS1的,示例中是转成了PKCS8格式。
7.使用了commons-codec这个JAR包来转换base64字符串。
8.如果要和其它语言互通,需要协商好:待签名字符串转为byte数组的编码、签名值byte数组转字符串的编码、哈希算法(SHA1WithRSA 还是 SHA256WithRSA)。
示例私钥,PKCS8格式:
MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDyNsCen1C5SKAy2qg7CUJRtrqgcP3f4eTv0oHcV7LIj3vj5oy+0SVk4USsKOSW+Ddg+Bn12bmBwxCA1aMcoSBzeLQFQT4OLA87I1+EP+b2Lrqf4xfU/77e+bY0MU6yatyb9rf99P5mDIn88JL89Z1rJYQrZnwJP1f8EAL0JcGY5bXO9+aYtDBP3qL7dDmuk+Wfc/57q233Lzr3zBCQ5EH3XuTgEr6b3IVduf4f/mrHWDvEldNLlj+xTjKnSZgR16yNYevaRLVsOzlIN+0ggUqeU+ZQDf9XnJEkd9yBbLfWnjOgGa4VZ5Y7nurEnBaOD3IG/vGfSZUEKtdw3uxbD+PZAgMBAAECggEBALdZrxHkM60uRuZ4EuUtqyBEHJ4bKnLxguXwChGL6XBc/UGVYnGHzLDCvcM86V1G5FTpOm2atQx/Zty/28tuRSxj8JIRwzHjNFxl+IYaAXHWCbvComXAevI7QSvdL19r+Teu2bTKYlFJqKLqUbpfCxzyt0xLNhWh9659SF8cvaJIuAblrKziXAyFYPDcLdmDPJI2rlsKKPiO5yXxOaj70pmULFBi4sKemabu23HtJkg48SdCcE4eZQhfIvloSDv4HYNT3l6sLezrHCemBIeTRk5V3wB96A/rjR1PgUIXttl6rUDp4nfMopTZpXnD7zPXhw5is7d/aiHc+E6CQvCqvQECgYEA+yADM23b53LNJs4shZHqC+Dc35j5DJjNswP0XA2Aq0SypY0fkUjI4qjiS2y4ktNwiFc9ljFOVyfQIczKcNXuhFswvbannBqqg7VYOCD4175URirfgtM4xU4TQiHm+5jyTz3GQiF7PdN2ISKGTiLs/fXrw3utaSgc7dukCYs6ZxECgYEA9up0gDZQ3/YhIjuEQBHiHhRQ9X3PriD8J4DJqTYSDG1OBZFPfO3YocJkCMTq9c2Jl2qPbLVP1BveAjIR6aExwQuolwisoM+QGurIcZY2m5dklYitRVg6+9AitCU/cqZK9U0vAPuDb3x1ZR/0+rYhQGcY+DFchtapTqzHSfXggEkCgYEA0PyXLVmjxD2Z1U2HZ7FC4ZfEuKAJwx33MZ984I6sIdwOABAt0S6NX3PEv5g/EpG7+PsBWdi2pXmQkFBpuPWQhb2OFpPHcPYQKYPlYvCtpn3SjIJpd+poOGr9Q/AK1h82qBN0xtwuQAmXKYQd2TDfoYnjJs/qRLUJPjmnjfm8JMECgYEAttoXnl8a81AdZ3F11dCoiCf5cGNUKhqJQWPRc3r0ULmdfugGWnj05Y3EcO4LJi6pBzXFsvZugKCGf0+/DinuY4yTtA2bcZdkm1plSCC6ney2czp9Po5BV/vhx1CSNQBLIG+hMHQR+LzNXy8UR5oa88ulpR9A6yYKyZWQHAh20ekCgYEAvgXQSX0GiXTMTTWUWtcrvHkATb3KKENcH8jmwa6sw/jU4FP2IxUmRwxRr/1mQ1RB/5RSYH/wbIfvoytBEVj40DMJzn0Aq/0+EwU3DP8ej6vkIK/U1/uxz/bVr7R7+dI2uw0THqXLo4hHTFElBZTREbnuWcqDPL+6ZU7FvpHP4iM=
公钥:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8jbAnp9QuUigMtqoOwlCUba6oHD93+Hk79KB3FeyyI974+aMvtElZOFErCjklvg3YPgZ9dm5gcMQgNWjHKEgc3i0BUE+DiwPOyNfhD/m9i66n+MX1P++3vm2NDFOsmrcm/a3/fT+ZgyJ/PCS/PWdayWEK2Z8CT9X/BAC9CXBmOW1zvfmmLQwT96i+3Q5rpPln3P+e6tt9y8698wQkORB917k4BK+m9yFXbn+H/5qx1g7xJXTS5Y/sU4yp0mYEdesjWHr2kS1bDs5SDftIIFKnlPmUA3/V5yRJHfcgWy31p4zoBmuFWeWO57qxJwWjg9yBv7xn0mVBCrXcN7sWw/j2QIDAQAB
待签名字符串:
Hello中国
工具类:
package com.company; import org.apache.commons.codec.binary.Base64; import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec; public class RsaUtil { /**
* 签名
* @param preStr 待签名字符串
* @param privateKeyPKCS8 私钥字符串PKCS8格式
* @return base64字符串
* @throws Exception
*/
public static String getSign(String preStr, String privateKeyPKCS8)
throws Exception { privateKeyPKCS8 = privateKeyPKCS8.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").replace("\r", "").replace("\n", "").trim(); String strSign = "";
String suite = "SHA256WithRSA"; //初始化算法SHA256
Signature signature = Signature.getInstance(suite);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyPKCS8));
//初始化私钥+RSA
KeyFactory keyFac = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFac.generatePrivate(keySpec);
signature.initSign(privateKey); //待签名字符串转byte数组使用UTF8
byte[] msgBuf = preStr.getBytes("UTF8");
signature.update(msgBuf);
byte[] byteSign = signature.sign();
//签名值byte数组转字符串用BASE64
strSign = Base64.encodeBase64String(byteSign);
return strSign; } /**
* 验证签名
* @param preStr 待验证签名字符串
* @param publicKeyStr 公钥字符串
* @param rspSign 待验证签名值
* @return 是否
* @throws Exception
*/
public static boolean verifySign(String preStr, String publicKeyStr, String rspSign)
throws Exception { publicKeyStr = publicKeyStr.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "").replace("\r", "").replace("\n", "").trim();
//待验证签名值base64解码
byte[] sign = Base64.decodeBase64(rspSign);
String suite = "SHA256WithRSA"; //初始化算法SHA256
Signature signature = Signature.getInstance(suite);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyStr));
//初始化公钥+RSA
KeyFactory keyFac = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFac.generatePublic(keySpec);
signature.initVerify(pubKey); //待签名字符串转byte数组使用UTF8
byte[] msgBuf = preStr.getBytes("UTF8");
signature.update(msgBuf);
boolean bRst = signature.verify(sign);
return bRst;
} }
调用DEMO:
package com.company; public class Main { public static void main(String[] args) { String privateKeyPKCS8 = "MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDyNsCen1C5SKAy2qg7CUJRtrqgcP3f4eTv0oHcV7LIj3vj5oy+0SVk4USsKOSW+Ddg+Bn12bmBwxCA1aMcoSBzeLQFQT4OLA87I1+EP+b2Lrqf4xfU/77e+bY0MU6yatyb9rf99P5mDIn88JL89Z1rJYQrZnwJP1f8EAL0JcGY5bXO9+aYtDBP3qL7dDmuk+Wfc/57q233Lzr3zBCQ5EH3XuTgEr6b3IVduf4f/mrHWDvEldNLlj+xTjKnSZgR16yNYevaRLVsOzlIN+0ggUqeU+ZQDf9XnJEkd9yBbLfWnjOgGa4VZ5Y7nurEnBaOD3IG/vGfSZUEKtdw3uxbD+PZAgMBAAECggEBALdZrxHkM60uRuZ4EuUtqyBEHJ4bKnLxguXwChGL6XBc/UGVYnGHzLDCvcM86V1G5FTpOm2atQx/Zty/28tuRSxj8JIRwzHjNFxl+IYaAXHWCbvComXAevI7QSvdL19r+Teu2bTKYlFJqKLqUbpfCxzyt0xLNhWh9659SF8cvaJIuAblrKziXAyFYPDcLdmDPJI2rlsKKPiO5yXxOaj70pmULFBi4sKemabu23HtJkg48SdCcE4eZQhfIvloSDv4HYNT3l6sLezrHCemBIeTRk5V3wB96A/rjR1PgUIXttl6rUDp4nfMopTZpXnD7zPXhw5is7d/aiHc+E6CQvCqvQECgYEA+yADM23b53LNJs4shZHqC+Dc35j5DJjNswP0XA2Aq0SypY0fkUjI4qjiS2y4ktNwiFc9ljFOVyfQIczKcNXuhFswvbannBqqg7VYOCD4175URirfgtM4xU4TQiHm+5jyTz3GQiF7PdN2ISKGTiLs/fXrw3utaSgc7dukCYs6ZxECgYEA9up0gDZQ3/YhIjuEQBHiHhRQ9X3PriD8J4DJqTYSDG1OBZFPfO3YocJkCMTq9c2Jl2qPbLVP1BveAjIR6aExwQuolwisoM+QGurIcZY2m5dklYitRVg6+9AitCU/cqZK9U0vAPuDb3x1ZR/0+rYhQGcY+DFchtapTqzHSfXggEkCgYEA0PyXLVmjxD2Z1U2HZ7FC4ZfEuKAJwx33MZ984I6sIdwOABAt0S6NX3PEv5g/EpG7+PsBWdi2pXmQkFBpuPWQhb2OFpPHcPYQKYPlYvCtpn3SjIJpd+poOGr9Q/AK1h82qBN0xtwuQAmXKYQd2TDfoYnjJs/qRLUJPjmnjfm8JMECgYEAttoXnl8a81AdZ3F11dCoiCf5cGNUKhqJQWPRc3r0ULmdfugGWnj05Y3EcO4LJi6pBzXFsvZugKCGf0+/DinuY4yTtA2bcZdkm1plSCC6ney2czp9Po5BV/vhx1CSNQBLIG+hMHQR+LzNXy8UR5oa88ulpR9A6yYKyZWQHAh20ekCgYEAvgXQSX0GiXTMTTWUWtcrvHkATb3KKENcH8jmwa6sw/jU4FP2IxUmRwxRr/1mQ1RB/5RSYH/wbIfvoytBEVj40DMJzn0Aq/0+EwU3DP8ej6vkIK/U1/uxz/bVr7R7+dI2uw0THqXLo4hHTFElBZTREbnuWcqDPL+6ZU7FvpHP4iM=";
String preStr = "Hello中国"; String publicKeyStr="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8jbAnp9QuUigMtqoOwlCUba6oHD93+Hk79KB3FeyyI974+aMvtElZOFErCjklvg3YPgZ9dm5gcMQgNWjHKEgc3i0BUE+DiwPOyNfhD/m9i66n+MX1P++3vm2NDFOsmrcm/a3/fT+ZgyJ/PCS/PWdayWEK2Z8CT9X/BAC9CXBmOW1zvfmmLQwT96i+3Q5rpPln3P+e6tt9y8698wQkORB917k4BK+m9yFXbn+H/5qx1g7xJXTS5Y/sU4yp0mYEdesjWHr2kS1bDs5SDftIIFKnlPmUA3/V5yRJHfcgWy31p4zoBmuFWeWO57qxJwWjg9yBv7xn0mVBCrXcN7sWw/j2QIDAQAB"; try {
String sign = RsaUtil.getSign(preStr, privateKeyPKCS8);
System.out.println("签名为:" + sign); boolean bRst=RsaUtil.verifySign(preStr, publicKeyStr,sign);
System.out.println("验证签名结果:" + bRst);
} catch (Exception ex) {
System.out.println(ex.getMessage());
} }
}
-源码:https://gitee.com/runliuv/mypub/tree/master/javaproj/java%E7%A7%81%E9%92%A5%E7%AD%BE%E5%90%8D%E5%85%AC%E9%92%A5%E9%AA%8C%E7%AD%BE
IDEA 社区版打开。
JAVA RSA 私钥签名 公钥验证签名 公钥验签的更多相关文章
- C#.NET RSA 私钥签名 公钥验证签名
C#.NET RSA 私钥签名 公钥验证签名 公钥验签 1.待签名字符串转为byte数组时,一般使用UTF8. 2.将私钥字符串(PKCS8或PKCS1格式)转为C#.NET的RSACryptoSer ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- openssl生成签名与验证签名
继上一篇RSA对传输信息进行加密解密,再写个生成签名和验证签名. 一般,安全考虑,比如接入支付平台时,请求方和接收方要互相验证是否是你,就用签名来看. 签名方式一般两种,对称加密和非对称加密.对称加密 ...
- JAVA RSA私钥 加密(签名) 对应 C# RSA私钥 加密(签名)
非对称密钥RSA算法加解密在C#和Java之间交互的问题,这两天看了很多其他人写的文章,碰到了几个问题,最终解决问题. 参考地址:http://xw-z1985.iteye.com/blog/1837 ...
- php生成签名及验证签名
<?php /** * 根据原文生成签名内容 * * @param string $data 原文内容 * * @return string * @author confu */ functio ...
- apt update时出现签名无法验证,公钥失效的解决办法
错误信息如下 W: GPG error: http://ppa.launchpad.net/ondrej/php/ubuntu xenial InRelease: The following sign ...
- 几个例子理解对称加密与非对称加密、公钥与私钥、签名与验签、数字证书、HTTPS加密方式
# 原创,转载请留言联系 为什么会出现这么多加密啊,公钥私钥啊,签名啊这些东西呢?说到底还是保证双方通信的安全性与完整性.例如小明发一封表白邮件给小红,他总不希望给别人看见吧.而各种各样的技术就是为了 ...
- java/php/c#版rsa签名以及验签实现
本文为转载,请转载请注明地址: 原文地址为 http://xw-z1985.iteye.com/blog/1837376 在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的 ...
- 验证签名机制——java示例
简单的验证公钥私钥签名认证: 公钥是对外公开的部分,私钥是不公开的部分,一般在项目开发中公钥是给用户,私钥是存于服务器上,二者中有一个加密,则需要另外一个来解密. 下面是java实现的一个比较简单的示 ...
- iOS RSA加解密签名和验证
转自:http://www.jianshu.com/p/81b0b54436b8 Pre:在公司负责了一个项目,需要用到iOS RSA验证签名的功能.后台给我的仅仅是一个公钥的字符串.经过起初的一段时 ...
随机推荐
- 力扣1050(MySQL)-合作过至少三次的演员和导演(简单)
题目: ActorDirector 表: 写一条SQL查询语句获取合作过至少三次的演员和导演的 id 对 (actor_id, director_id) 示例: 建表语句: 1 create tab ...
- PolarDB-X 源码解读系列:DML 之 INSERT IGNORE 流程
简介: 本文将进一步介绍 PolarDB-X 中 INSERT IGNORE 的执行流程,其根据插入的表是否有 GSI 也有所变化. 作者:潜璟 在上一篇源码阅读中,我们介绍了 INSERT 的执行流 ...
- 独家深度 | 一文看懂 ClickHouse vs Elasticsearch:谁更胜一筹?
简介: 本文的主旨在于通过彻底剖析ClickHouse和Elasticsearch的内核架构,从原理上讲明白两者的优劣之处,同时会附上一份覆盖多场景的测试报告给读者作为参考. 作者:阿里云数据库OLA ...
- 【阿里云 CDP 公开课】 第二讲:CDH/HDP 何去何从
简介:Hadoop社区版CDH/HDP已经不再更新,也将终止服务.后续的平台路线图怎么规划?Cloudera CDP整合了CDH和HDP,有哪些性能提升和功能增强?如何平滑的进行迁移?本文结合CDH ...
- 如何避免 Go 命令行执行产生“孤儿”进程?
简介: 在 Go 程序当中,如果我们要执行命令时,通常会使用 exec.Command ,也比较好用,通常状况下,可以达到我们的目的,如果我们逻辑当中,需要终止这个进程,则可以快速使用 cmd.Pro ...
- 技术干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径
简介: 全链路压测方案下,非加密场景下至少有 70% 的性能提升,加密场景下 10%的性能提升,并在 MGS 扩容完成后可实现大幅的性能提升,调优的结果远超预期. 业务背景 随着移动开发行业的步 ...
- Alibaba FFI -- 跨语言编程的探索
简介: 跨语言编程时现代程序语言中非常重要的一个方向,也被广泛应用于复杂的设计与实现中. 跨语言编程是现代程序语言中非常重要的一个方向,也被广泛应用于复杂系统的设计与实现中.本文是 GIAC 202 ...
- rerank来提升RAG的准确度的策略
RAG(Retrieval-Augmented Generation)是一种结合检索和生成两种技术的模型,旨在通过检索大规模知识库来增强文本生成任务的准确性. 要通过reranking(重排序)来提升 ...
- [Linux] 日志管理: rsyslogd 服务 (检测启动/自启动/日志位置)
查看 rsyslogd 服务是否已启动: ps aux | grep rsyslogd 查看 rsyslogd 是否设置了自启动: systemctl status rsyslog 或者 servic ...
- SQL server 批量删除表
select 'drop table '+name+';' from sys.tables declare c cursor forselect NAME from sysobjects where ...