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 私钥签名 公钥验证签名 公钥验签的更多相关文章

  1. C#.NET RSA 私钥签名 公钥验证签名

    C#.NET RSA 私钥签名 公钥验证签名 公钥验签 1.待签名字符串转为byte数组时,一般使用UTF8. 2.将私钥字符串(PKCS8或PKCS1格式)转为C#.NET的RSACryptoSer ...

  2. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  3. openssl生成签名与验证签名

    继上一篇RSA对传输信息进行加密解密,再写个生成签名和验证签名. 一般,安全考虑,比如接入支付平台时,请求方和接收方要互相验证是否是你,就用签名来看. 签名方式一般两种,对称加密和非对称加密.对称加密 ...

  4. JAVA RSA私钥 加密(签名) 对应 C# RSA私钥 加密(签名)

    非对称密钥RSA算法加解密在C#和Java之间交互的问题,这两天看了很多其他人写的文章,碰到了几个问题,最终解决问题. 参考地址:http://xw-z1985.iteye.com/blog/1837 ...

  5. php生成签名及验证签名

    <?php /** * 根据原文生成签名内容 * * @param string $data 原文内容 * * @return string * @author confu */ functio ...

  6. apt update时出现签名无法验证,公钥失效的解决办法

    错误信息如下 W: GPG error: http://ppa.launchpad.net/ondrej/php/ubuntu xenial InRelease: The following sign ...

  7. 几个例子理解对称加密与非对称加密、公钥与私钥、签名与验签、数字证书、HTTPS加密方式

    # 原创,转载请留言联系 为什么会出现这么多加密啊,公钥私钥啊,签名啊这些东西呢?说到底还是保证双方通信的安全性与完整性.例如小明发一封表白邮件给小红,他总不希望给别人看见吧.而各种各样的技术就是为了 ...

  8. java/php/c#版rsa签名以及验签实现

    本文为转载,请转载请注明地址: 原文地址为        http://xw-z1985.iteye.com/blog/1837376 在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的 ...

  9. 验证签名机制——java示例

    简单的验证公钥私钥签名认证: 公钥是对外公开的部分,私钥是不公开的部分,一般在项目开发中公钥是给用户,私钥是存于服务器上,二者中有一个加密,则需要另外一个来解密. 下面是java实现的一个比较简单的示 ...

  10. iOS RSA加解密签名和验证

    转自:http://www.jianshu.com/p/81b0b54436b8 Pre:在公司负责了一个项目,需要用到iOS RSA验证签名的功能.后台给我的仅仅是一个公钥的字符串.经过起初的一段时 ...

随机推荐

  1. 力扣289(java)-生命游戏(中等)

    题目: 根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞 ...

  2. 学术顶会再突破!计算平台MaxCompute论文入选国际顶会VLDB 2021

    ​ 简介: VLDB 2021上,阿里云计算平台MaxCompute参与的论文入选,核心分布式调度执行引擎Fangorn.基于TVR Cost模型的通用增量计算优化器框架Tempura等分别被Indu ...

  3. 从零开始写 Docker(十二)---实现 mydocker stop 停止容器

    本文为从零开始写 Docker 系列第十二篇,实现类似 docker stop 的功能,使得我们能够停止指定容器. 完整代码见:https://github.com/lixd/mydocker 欢迎 ...

  4. 和 ChatGPT 聊聊 .NET 编译和执行背后的那些事儿

    1 .NET 编译.构建.执行涉及到哪些概念 在 .NET 编译.构建和执行中,涉及到以下概念: C# 或 Visual Basic .NET 等编程语言: 这些是 .NET Framework 使用 ...

  5. Spring Boot应用中如何动态指定数据库,实现不同用户不同数据库的场景

    当在 Spring Boot 应用程序中使用Spring Data JPA 进行数据库操作时,配置Schema名称是一种常见的做法.然而,在某些情况下,模式名称需要是动态的,可能会在应用程序运行时发生 ...

  6. C语言结构体的内存分配

    一.结构体内存分配原则 原则一:结构体中元素按照定义顺序存放到内存中,但并不是紧密排列.从结构体存储的首地址开始 ,每一个元素存入内存中时,它都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置 ...

  7. Linux系统命令-目录命令

    1.ls命令:主要作用是显示目录下的内容 基本格式 [root@localhost ~]# ls [选项] [参数是文件名或目录名] 常用选项 -a:显示所有文件 --color=when:支持颜色输 ...

  8. WSL2使用桥接网络,并指定IP

    前言 微软终于解决了宇宙级难题了,一直以来的WSL2每次启动IP都是动态分配的,并且是NAT的网络.当然网上对此也有一些解决方案,编写脚本在启动时修改,但是太麻烦了,这次很完美的解决了这个难题. 检查 ...

  9. 【OpenVINO™】使用OpenVINO™ C# API 部署 YOLO-World实现实时开放词汇对象检测

    YOLO-World是一个融合了实时目标检测与增强现实(AR)技术的创新平台,旨在将现实世界与数字世界无缝对接.该平台以YOLO(You Only Look Once)算法为核心,实现了对视频中物体的 ...

  10. 一文搞懂 ARM 64 系列: ADC

    1 指令语法 adc <Xd>, <Xn>, <Xm> 2 指令语义 adc就是带「进位」加法,指令中的c就是英文carry. 整个指令等价于: (Xd, _) = ...