网上的文档很多,但是不够全面,最重要有些代码不能用!!!

参考文档:

java实现(RSA非对称加密) SHA1WithRSA加签验签 及openssl生成公私钥      感谢博主!!

使用 openssl 生成证书(含openssl详解)

一、数字签名流程

本地发送请求时(本地已对请求根据私钥进行加签)      接收方平台根据公钥进行验签          判断是否合法

接收来自平台的响应时(平台已根据私钥进行加签)      需要根据本地公钥对响应进行验签    判断是否合法

二、生成公钥和私钥

1、在Linxu上输入命令: openssl

2、输入命令:genrsa -out rsa_oo_private_key.pem 2048

3、私钥转换成PKCS8格式再做签名使用,输入命令:pkcs8 -topk8 -inform PEM -in rsa_oo_private_key.pem -outform PEM -nocrypt

注意:私钥就是输入pkcs8 -topk8 -inform PEM -in rsa_oo_private_key.pem -outform PEM -nocrypt打印出来的这块内容:

MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCqrpUHZx/NSRsK
jQc9i/gCGzU9Q3qRf44pm0lML9FfJf+m9mo9qdAEsMl3N0Y/nVcdGWb8VBry+dyl
mKNR4VPfFNGQKWW8OtvUlT9l3I9/MTd/ZsoVt2dQdBvOp7+9hrClS+rmw/HFz81l
RCFcku8HIIIcFxPQylRgSxHI8PMVJEodBsQSRvOzGtzWTfhTfG0Y0sgZPt75hKjd
J1rTo4264AG3YzlxHlmqrrQxxmYEKEnNplmNVga2bXvPICZ2VPbl9w/52mlSobg3
6VPKMzdlhTUgFsADPMaG2Pf3GqOa2GTSupzgTyz/54LyF6gCbXcAknRFgH5eyAv5
tPqV9CsrAgMBAAECggEAAXIHCxABgfCLjRRSql/EEuh+E+29XPwSjSGmhkGlaUPe
HWDa13jXrSJ+IkdSjflcIn/zklF4BPS+vJxFTc01s57ug2UGWoi5EdzNs6Qhhvc4
vBh3v6VU96Z0EdTz17wLROsWqyufoYg3+hKQocMQySOqVmiPn2YHPuWD2grIVDZ9
68mC1FykGEcv9De0m6yVEsfZDXNUxm3cz1758iBqakvyOVxGsI+V+e7/iSxJiwIB
6f3NSGQVtEsqwyhnl6dZRYDtnq5iUiwUOshl5Z2CYBfBcyTpMKC2RuHp3u9THHpc
3TFE4I1Li5HkiFy+ai6QKl2M85ce3GCXmjyw7n2vmQKBgQDTHihNX6uu6YlVFcRa
XhhGigyLrIP8LbLd4r/dKMXuGa8XqkLPlDtXelh2n565Lo5DPGlpANi3Jp495Hzn
bL+YnHJs7boVOGtORB0XHUbiMaTlT85snpvVjwFngHvY/ZxtXclpsnX563AvzCyl
amrKEhV17BFZbRQOTEL1UNp57QKBgQDO98AyfVgs1tCdtLOsFSFiWrAsJJimBS7b
ec+W/UPGDAl3hFzQzJ2SUvF4EneatYVOEDdHLUzVnT7XXeA/eMZL56N8BTSffh8q
XK0E21K8tW4hRbze6CIjbsJ1x7ZLZaoM4Ub2YAvkulF0PcasX0kWl+bv/DnkI09x
/n3vgbO2dwKBgQCoAnj6UmeztEDJiKARdo6FHHmtciY7Ozb8Y+Zin38c5C22fJXc
0k+DZ2cdSBwtrQIkOeB9YuIUp1QJV1ubZKz5S4+4ZlvPZW3oBEbOTUtK2U0r/J3/
TR4hD0SD1Pk6j2G8m4Wdaxt+P8KxFyB0p8LCey++/5Yy/56VXlVvGuAzZQKBgQCU
VfcXeMTIplGwpkGcFSzvLCZWDQim/NH/lYdWJUD84cWrNl+7ett4cyADueClLnJT
Z8Xmqq4F8ASJIQxHEY21+1gt3CFCKoe1ueR7taHQBIzhJfVfIarOEGUpOzEJSt0d
DBzrGh2MGomksV4CTuy4V7i5yeHIBBK9lfO2xBQEswKBgQCIzYO53kTFl6YGjmWO
qUJsT+5WegR4GdxtqYpQGPC1RmU7ig1TZzen+X3xB+lIHqgA1HvTr6M+tPkmnMwU
iARPOgjXY0zmsStXaHQYKruT3EjZRs2GnmVpVOAj1asqi+/2t0NgLgB5gPLYMXS+
BGf01OehvUt5Ge+OChDBXSW5Bw==

4、生成公钥,输入命令:rsa -in rsa_oo_private_key.pem -pubout -out rsa_public_key.pem

接下来输入命令:cd ~/.ssh/,more rsa_public_key.pem ,得到公钥

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqq6VB2cfzUkbCo0HPYv4
Ahs1PUN6kX+OKZtJTC/RXyX/pvZqPanQBLDJdzdGP51XHRlm/FQa8vncpZijUeFT
3xTRkCllvDrb1JU/ZdyPfzE3f2bKFbdnUHQbzqe/vYawpUvq5sPxxc/NZUQhXJLv
ByCCHBcT0MpUYEsRyPDzFSRKHQbEEkbzsxrc1k34U3xtGNLIGT7e+YSo3Sda06ON
uuABt2M5cR5Zqq60McZmBChJzaZZjVYGtm17zyAmdlT25fcP+dppUqG4N+lTyjM3
ZYU1IBbAAzzGhtj39xqjmthk0rqc4E8s/+eC8heoAm13AJJ0RYB+XsgL+bT6lfQr
KwIDAQAB

三、代码实现

1、引入依赖

 <dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.11</version>
</dependency>

2、具体代码

package com.cn.dl;import org.apache.commons.codec.binary.Base64;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;/*** SHA1WithRSA-数字签名* Created by yanshao on 2018/12/12.*/
// TODO: 2018/12/12 数字签名就发现这个能用
// TODO: 2018/12/12 原文地址:https://blog.csdn.net/qq_23974323/article/details/77678491
public class RSATest2 {//加密算法public static final String  SIGN_ALGORITHMS = "SHA1WithRSA";//私钥private static final String privateKey = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCqrpUHZx/NSRsK" +"jQc9i/gCGzU9Q3qRf44pm0lML9FfJf+m9mo9qdAEsMl3N0Y/nVcdGWb8VBry+dyl" +"mKNR4VPfFNGQKWW8OtvUlT9l3I9/MTd/ZsoVt2dQdBvOp7+9hrClS+rmw/HFz81l" +"RCFcku8HIIIcFxPQylRgSxHI8PMVJEodBsQSRvOzGtzWTfhTfG0Y0sgZPt75hKjd" +"J1rTo4264AG3YzlxHlmqrrQxxmYEKEnNplmNVga2bXvPICZ2VPbl9w/52mlSobg3" +"6VPKMzdlhTUgFsADPMaG2Pf3GqOa2GTSupzgTyz/54LyF6gCbXcAknRFgH5eyAv5" +"tPqV9CsrAgMBAAECggEAAXIHCxABgfCLjRRSql/EEuh+E+29XPwSjSGmhkGlaUPe" +"HWDa13jXrSJ+IkdSjflcIn/zklF4BPS+vJxFTc01s57ug2UGWoi5EdzNs6Qhhvc4" +"vBh3v6VU96Z0EdTz17wLROsWqyufoYg3+hKQocMQySOqVmiPn2YHPuWD2grIVDZ9" +"68mC1FykGEcv9De0m6yVEsfZDXNUxm3cz1758iBqakvyOVxGsI+V+e7/iSxJiwIB" +"6f3NSGQVtEsqwyhnl6dZRYDtnq5iUiwUOshl5Z2CYBfBcyTpMKC2RuHp3u9THHpc" +"3TFE4I1Li5HkiFy+ai6QKl2M85ce3GCXmjyw7n2vmQKBgQDTHihNX6uu6YlVFcRa" +"XhhGigyLrIP8LbLd4r/dKMXuGa8XqkLPlDtXelh2n565Lo5DPGlpANi3Jp495Hzn" +"bL+YnHJs7boVOGtORB0XHUbiMaTlT85snpvVjwFngHvY/ZxtXclpsnX563AvzCyl" +"amrKEhV17BFZbRQOTEL1UNp57QKBgQDO98AyfVgs1tCdtLOsFSFiWrAsJJimBS7b" +"ec+W/UPGDAl3hFzQzJ2SUvF4EneatYVOEDdHLUzVnT7XXeA/eMZL56N8BTSffh8q" +"XK0E21K8tW4hRbze6CIjbsJ1x7ZLZaoM4Ub2YAvkulF0PcasX0kWl+bv/DnkI09x" +"/n3vgbO2dwKBgQCoAnj6UmeztEDJiKARdo6FHHmtciY7Ozb8Y+Zin38c5C22fJXc" +"0k+DZ2cdSBwtrQIkOeB9YuIUp1QJV1ubZKz5S4+4ZlvPZW3oBEbOTUtK2U0r/J3/" +"TR4hD0SD1Pk6j2G8m4Wdaxt+P8KxFyB0p8LCey++/5Yy/56VXlVvGuAzZQKBgQCU" +"VfcXeMTIplGwpkGcFSzvLCZWDQim/NH/lYdWJUD84cWrNl+7ett4cyADueClLnJT" +"Z8Xmqq4F8ASJIQxHEY21+1gt3CFCKoe1ueR7taHQBIzhJfVfIarOEGUpOzEJSt0d" +"DBzrGh2MGomksV4CTuy4V7i5yeHIBBK9lfO2xBQEswKBgQCIzYO53kTFl6YGjmWO" +"qUJsT+5WegR4GdxtqYpQGPC1RmU7ig1TZzen+X3xB+lIHqgA1HvTr6M+tPkmnMwU" +"iARPOgjXY0zmsStXaHQYKruT3EjZRs2GnmVpVOAj1asqi+/2t0NgLgB5gPLYMXS+" +"BGf01OehvUt5Ge+OChDBXSW5Bw==";//公钥private static final String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqq6VB2cfzUkbCo0HPYv4" +"Ahs1PUN6kX+OKZtJTC/RXyX/pvZqPanQBLDJdzdGP51XHRlm/FQa8vncpZijUeFT" +"3xTRkCllvDrb1JU/ZdyPfzE3f2bKFbdnUHQbzqe/vYawpUvq5sPxxc/NZUQhXJLv" +"ByCCHBcT0MpUYEsRyPDzFSRKHQbEEkbzsxrc1k34U3xtGNLIGT7e+YSo3Sda06ON" +"uuABt2M5cR5Zqq60McZmBChJzaZZjVYGtm17zyAmdlT25fcP+dppUqG4N+lTyjM3" +"ZYU1IBbAAzzGhtj39xqjmthk0rqc4E8s/+eC8heoAm13AJJ0RYB+XsgL+bT6lfQr" +"KwIDAQAB";/*** 使用私钥给入参签名* @param privateKey 私钥* @param param      签名的数据* @return            返回入参签名16进制字符串* */public static String sign(String privateKey, String param) {try {//获取privatekeybyte[] privateKeyByte = new Base64().decode(privateKey);KeyFactory keyfactory = KeyFactory.getInstance("RSA");PKCS8EncodedKeySpec encoderule = new PKCS8EncodedKeySpec(privateKeyByte);PrivateKey key = keyfactory.generatePrivate(encoderule);//用私钥给入参加签Signature sign = Signature.getInstance(SIGN_ALGORITHMS);sign.initSign(key);sign.update(param.getBytes());byte[] signature = sign.sign();//将签名的入参转换成16进制字符串return bytesToHexStr(signature);} catch (Exception e) {e.printStackTrace();}return null;}/*** 用公钥验证签名* @param param       入参* @param signature   使用私钥签名的入参字符串* @param publicKey   公钥* @return             返回验证结果* */public static boolean verifyRes(String param,String signature,String publicKey){try {//获取公钥KeyFactory keyFactory=KeyFactory.getInstance("RSA");byte[] publicKeyByte= new Base64().decode(publicKey);X509EncodedKeySpec encodeRule=new X509EncodedKeySpec(publicKeyByte);PublicKey key= keyFactory.generatePublic(encodeRule);//用获取到的公钥对   入参中未加签参数param 与  入参中的加签之后的参数signature 进行验签Signature sign=Signature.getInstance(SIGN_ALGORITHMS);sign.initVerify(key);sign.update(param.getBytes());//将16进制码转成字符数组byte[] hexByte = hexStrToBytes(signature);//验证签名return sign.verify(hexByte);}  catch (Exception e) {e.printStackTrace();}return false;}/*** byte数组转换成十六进制字符串* @param bytes byte数组* @return      返回十六进制字符串*/private static String bytesToHexStr(byte[] bytes) {StringBuffer stringBuffer = new StringBuffer("");for (int i = 0; i < bytes.length; ++i) {stringBuffer.append(Integer.toHexString(0x0100 + (bytes[i] & 0x00FF)).substring(1).toUpperCase());}return stringBuffer.toString();}/*** 十六进制字符串转成byte数组* @param hexStr   十六进制字符串* @return          返回byte数组* */private static byte[] hexStrToBytes(String hexStr) {byte[] bytes = new byte[hexStr.length() / 2];for (int i = 0; i < bytes.length; i++) {bytes[i] = (byte) Integer.parseInt(hexStr.substring(2 * i, 2 * i + 2), 16);}return bytes;}public static void main(String[] args) {String param = "yanshao";String sign = sign(privateKey,param);System.out.println("签名后的参数>>>"+sign);System.out.println("验证结果>>>"+verifyRes(param,sign,publicKey));}}

3、运行结果

签名后的参数>>>27D167B2B5C0DB4ABBCA38ADBAB56648C372E4306DAF0D815AFD2092CD8F354D280D0F5C9E9FFAD0643C6833255B0FDDFCD366246744ECB079A26046215EEA887836E403A4DC7604F6B1EFE0A2131E2741CFB14DCE1E8BEB40F28D369B1AF19D20295D520620196F3822F2DBA94DFCFC6A7282F74A6B65DB56DFD522894C0C0E1C138CE3BC4EDCD0E47B62E81F857E881045F7EA62D9B9E10678C36183F9350E35BE2221F982AA4ABB4133137827080C35373DC563C0E08190433F012F575979627F91F45EA0A3244DA034A87931042F33EDB60CF7903D595D5C9A1C03B6FCE63A37B26C17EE319E5870EF4E6EFA44CFAA0E6E98CCC9158E0826BE87B4CFC6E1
验证结果>>>true

SHA1WithRSA-数字签名相关推荐

  1. java sha1withrsa公钥加密_数字签名----sha1withrsa

    项目中进行了sha1withrsa数字签名.对此总结一下吧. 浅谈加密与签名 我们一般的加密主要分2种.对称加密.非对称加密.顾名思义.对称加密就是秘钥是一样的.通过同一个秘钥加密解密.这一类的加密算 ...

  2. 常用的安全算法-数字摘要、对称加密、非对称加密详解

    本文仅介绍摘要算法.对称加密算法.非对称加密算法的使用场景和使用方法. 1.数字摘要 说明:数字摘要是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是Hash函数.数字摘要 ...

  3. Java数字签名——RSA算法

    数字签名:带有密钥(公钥,私钥)的消息摘要算法. 验证数据的完整性,认证数据的来源,抗否性 OSI参考模型 私钥签名,公钥验证 签名算法:RSA,DSA,ECDSA 算法1 :RSA MD,SHA两类 ...

  4. 数字签名的java实现(RSA,DSA)

    2019独角兽企业重金招聘Python工程师标准>>> 基本概念: 数字签名,顾名思义,就类似于一种写在纸上的普通的物理签名. 简单说就是将文件内容进行hash散列(消息摘要),信息 ...

  5. Java加密与解密的艺术~数字签名~RSA实现

    RSA 实现 /*** 2008-6-11*/ package org.zlex.chapter09_1;import java.security.Key; import java.security. ...

  6. MD5 SHA1 SHA256 SHA512 SHA1WithRSA RSA 的区别

    转自:http://www.cnblogs.com/cxygg/p/9468653.html https://blog.csdn.net/hengshujiyi/article/details/459 ...

  7. Java安全之对称加密、非对称加密、数字签名

    Java中加密分为两种方式一个是对称加密,另一个是非对称加密.对称加密是因为加密和解密的钥匙相同,而非对称加密是加密和解密的钥匙不同. 对称加密与非对称加密的区别: 对称加密称为密钥加密,速度快,但加 ...

  8. java sha1withrsa公钥加密,sha1withrsa在线加密

    (); Rsa_Op ro =new Rsa_Op(); Sig s = new Sig(); "使用 SHA-1 算法生成摘要"); ("SHA1WithRSA&quo ...

  9. PKI基础知识(数字信封与数字签名过程,对称密钥与非对称密钥)

    1.数字信封 关于对称密码术和非对称密码:前者具有加密速度快.运行时占用资源少等特点,后者可以用于密钥交换.一般来说,并不直接使用非对称加密算法加密明文,而仅用它保护实际加密明文的对称密钥,来减少运算 ...

  10. 用DSA算法实现数字签名

    下面是一个在JAVA语言中,使用DSA签名算法来进行进行数字签名的一个示例. DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NI ...

最新文章

  1. 查看linux系统版本信息 lsb_release -a
  2. jquery 判断一个对象是否存在
  3. proguard的简单配置说明
  4. js代码中可以有java的对象吗_js原型对象与Java类的区别
  5. 能源36号文解读_中国能源报
  6. element 方法返回的boolean被当成字符串了_13个需要知道的方法:使用 JavaScript 来操作 DOM...
  7. Spring Boot笔记-JPA分页(后端分页)
  8. 记一次神奇的sql查询经历,group by慢查询优化(已解决)
  9. vba odbc 3704 mysql_[求助]ado对象调用存储过程运行时错误3704
  10. java数组验证哥德巴赫猜想_验证哥德巴赫猜想的JAVA代码
  11. help/Makefile.am:21: error: USE_NLS does not appear in AM_CONDITIONAL
  12. paip.基于urlrewrite的反向代理以及内容改写
  13. 1寸、2寸、小2寸的照片尺寸是多少
  14. 【ACWing】1489. 田忌赛马
  15. 多云时代下数据管理技术_建立一个混合的多云数据湖并使用Apache Spark执行数据处理...
  16. 激动!!!他用脚拆开研究生录取通知书
  17. java web全栈_web全栈java开发哪个前景好
  18. 嵌入式操作系统判断题
  19. Soot -- Soot中的一些语句细节
  20. msp430学习书籍

热门文章

  1. 嵌入式开发:使用条件复杂度测试嵌入式软件
  2. Go Web学习笔记(Gin和Gorm)
  3. 【测试沉思录】22. 前端性能测试怎么做?
  4. SQL语句更改字段名
  5. 使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法
  6. Couldn't resolve error at 'ntdll!NtOpenProcess'
  7. linux 起网口up_查看Linux下网卡连接状态(up还是down)?
  8. 移动web开发 手机输入框弹出的问题
  9. other-note
  10. HTML 下拉框