- 浏览: 54321 次
- 性别:
- 来自: 洛阳
文章分类
最新评论
Rsa签名算法详解
签名生成规则与验证签名规则如下:
①每次生成签名时该算法都会生成一对对应的公钥和私钥对,
②所以在应用中一般都会采取使用同一对密钥对进行签名与验签(建议使用静态变量)保证对方验证签名时用的公钥是与你生成签名用的是同一对,否则就不能通过验证
③将自己生成的秘钥对中的公钥交给对方用来验证你的签名,私钥用来生成签名
④同样的对方也会选定一组密钥对将公钥给你用来验证签名,用他的私钥来生成签名
⑤备注:一般对安全性要求比较高的企业,不仅仅限与用rsa签名来保证安全,还会对rsa签名再次加密,比如本案例就使用了base64来加密和解密,同样大家也可以采取其他的措施来增加安全性比如:aes等
注意事项:
①在获取对方的签名的时候注意是否有系统会自动生成空格(尤其是签名串在换行的时候)
②在拼装对方的加密串转换成byte类型时注意是否跟对方的字符编码保持一致
①每次生成签名时该算法都会生成一对对应的公钥和私钥对,
②所以在应用中一般都会采取使用同一对密钥对进行签名与验签(建议使用静态变量)保证对方验证签名时用的公钥是与你生成签名用的是同一对,否则就不能通过验证
③将自己生成的秘钥对中的公钥交给对方用来验证你的签名,私钥用来生成签名
④同样的对方也会选定一组密钥对将公钥给你用来验证签名,用他的私钥来生成签名
⑤备注:一般对安全性要求比较高的企业,不仅仅限与用rsa签名来保证安全,还会对rsa签名再次加密,比如本案例就使用了base64来加密和解密,同样大家也可以采取其他的措施来增加安全性比如:aes等
注意事项:
①在获取对方的签名的时候注意是否有系统会自动生成空格(尤其是签名串在换行的时候)
②在拼装对方的加密串转换成byte类型时注意是否跟对方的字符编码保持一致
具体的实现代码如下
package com.xxx.web.util; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * @Description: (签名工具类) * @author keguan_li * @date 2016年9月22日 */ public class RSAUtils { /** */ /** * 加密算法RSA */ public static final String KEY_ALGORITHM = "RSA"; /** */ /** * 签名算法 */ public static final String SIGNATURE_ALGORITHM = "MD5withRSA";//有几种算法MD5withRSA是其中一种 public static final String CHARSET = "UTF-8"; /** * initKey()生成公钥与私钥 * 将生成的公钥与对方互换 * 因为每次生成签名的时候公钥和私钥都会随机变化(一对密钥对) * 所以要将自己的私钥和对方的公钥设成静态变量 * 保证每次生成签名用的都是同一个私钥 */ public static final String privateKey="MIICeAIB2QcCQQCvpSVi/IElHyzvvPxRKsTYz/Z"; public static final String publicKey="MIGfMA0GCSqGSvcuK3QJ3i9ZhBpOoyd4JOwIDAQAB"; /** * 生成签名 * @param retSignPacket * @param strPriKey * @return * @throws Exception */ public static String addSign(String retSignPacket) throws Exception{ byte[] bytesKey = decryptBASE64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(bytesKey); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec); Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initSign(priKey); signature.update(retSignPacket.getBytes(CHARSET)); String sign = encryptBASE64(signature.sign()); return sign; } /** * 校验数字签名 * * @param data * 加密数据 * @param publicKey * 公钥 * @param sign * 数字签名 * * @return 校验成功返回true 失败返回false * @throws Exception * */ public static boolean verify(byte[] data, String sign) throws Exception { // 解密由base64编码的公钥 byte[] keyBytes = decryptBASE64(publicKey); // 构造X509EncodedKeySpec对象 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); // KEY_ALGORITHM 指定的加密算法 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); // 取公钥匙对象 PublicKey pubKey = keyFactory.generatePublic(keySpec); Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initVerify(pubKey); signature.update(data); // 验证签名是否正常 boolean ret = signature.verify(decryptBASE64(sign)); System.out.println("验签结果:" + ret); return ret; } public static Map<String, Object> initKey() throws Exception { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); keyPairGen.initialize(1024); KeyPair keyPair = keyPairGen.generateKeyPair(); // 公钥 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 私钥 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String, Object> keyMap = new HashMap<String, Object>(2); keyMap.put("RSAPublicKey", encryptBASE64(publicKey.getEncoded())); keyMap.put("RSAPrivateKey", encryptBASE64(privateKey.getEncoded())); System.out.println("私钥为(生成签名用) : "); String priKey = encryptBASE64(privateKey.getEncoded()); System.out.println(priKey); System.out.println("*****************"); System.out.println("公钥为(验证签名用) : "); String pubKey = encryptBASE64(publicKey.getEncoded()); System.out.println(pubKey); return keyMap; } /** * BASE64解密 * * @param key * @return * @throws Exception */ @SuppressWarnings("restriction") public static byte[] decryptBASE64(String key) throws Exception { return (new BASE64Decoder()).decodeBuffer(key); } /** * BASE64加密 * * @param key * @return * @throws Exception */ @SuppressWarnings("restriction") public static String encryptBASE64(byte[] key) throws Exception { return (new BASE64Encoder()).encodeBuffer(key); } public static void main(String[] args) throws Exception { initKey();//该方法生成签名,私钥本地用于本地签名,公钥交给对方用于验证你的签名 addSign("a");//生成签名的方法,a为你要生成签名的签名串,还有用于生成签名的私钥,已写成静态常量 verify("a".getBytes(),"b");//验证签名的方法,a为你拼接的对方的加密串(在转成byte时字符集编码要与对方的字符集编码保持一致),b为对方的签名,还有对方的公钥我已经将其写成静态常量了 } }
发表评论
-
Condition
2017-01-03 16:58 0condition的应用 -
java对sftp文件进行上传、下载、删除等操作,附详细demo
2016-12-22 18:01 2087这是自己总结的一个类,包含连接sftp,上传,下载等操作,附件 ... -
servlet监听器功能讲解及代码案例
2017-07-08 16:54 620servlet监听器功能讲解及代码案例 监听器的功能很强大, ... -
web.xml之session超时设置 以及设置session超时的几种方法
2016-10-20 16:39 1189web.xml之session超时设置 先说正题,web. ... -
web.xml之过滤器详解 以及常用过滤器demo
2016-10-20 14:15 2716web.xml之过滤器详解 一 ... -
poi导出excel清晰 步骤详解
2016-10-14 14:08 843poi导出excel清晰 步骤详解 一、本次生成excel ... -
struts2下载文件最简化版清晰详解
2016-10-14 11:20 614struts2下载文件最简化版清晰详解 一、应用场景如下: ... -
poi解析excel步骤详解
2016-10-14 10:42 2115poi解析excel步骤详解 一、本次解析excel应用场景 ... -
struts2文件上传详解
2016-10-13 11:26 806struts2文件上传详解 一、jsp代码 <fo ... -
ThreadLocal用法详解
2016-09-29 10:44 1602ThreadLocal用法详解 1.ThreadLocal的 ... -
JSONObject、JSONArray、xml的常用操作
2016-09-28 16:33 1364JSONObject、JSONArray、xml的常用操作 ... -
Quartz定时任务的实现及详解
2016-09-21 18:03 2161Quartz定时任务的实现及详解 平常工作中经常遇到写定时任 ... -
四种线程池的特性以及测试代码
2016-09-21 09:20 904四种线程池的特点如下 ... -
操作json
2016-09-18 13:01 641总是记不住一些零碎的知识点,这次开个专栏来记录,不定期更新: ... -
日期类型转换
2016-09-18 12:50 531总是记不住一些零碎的知识点,这次开个专栏来记录,不定期更新: ... -
配置文件的读取与写入
2016-09-14 17:00 649读取配置文件: public static void m ... -
HttpPoster接口调用
2016-09-13 13:47 1623工作中经常用到的东西,这也是自己在公司的基础上改造的,感觉挺好 ... -
md5加密
2016-09-13 13:39 594md5工具类如下所示,可以直接拿走用,分享记录一下 pack ... -
AES加密与解密
2016-09-13 13:37 477这个其实是我们项目里面的一个工具类,给大家做一下分享 aes ... -
循环map取值的方法
2016-09-08 13:00 1543循环map取值的方法,如下所示: 方法一: Map< ...
相关推荐
python实现签名RSA算法工程文件 详解博客地址:https://blog.csdn.net/m0_52316372/article/details/125695341
### RSA算法详解 #### 一、RSA算法简介 RSA算法是一种重要的公钥加密技术,它由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家于1977年提出,因此命名为RSA。这一算法是首个既可用于数据加密也能实现数字签名...
C#中RSA加密算法详解 在C#程序中,RSA加密算法是一种广泛使用的公钥加密算法。 RSA加密算法于1977年由Ron Rivest、Adi Shamir和Len Adleman在美国麻省理工学院开发的。RSA取名来自开发他们三者的名字。RSA是目前最...
第三章 RSA算法详解 RSA算法由Rivest、Shamir和Adleman三位科学家提出,它结合了大整数因子分解的困难性,构建了一种可信赖的加密和签名机制。RSA算法的实现包括两个主要步骤:密钥生成和操作(加密、解密、签名和...
【RSA数字签名实现详解】 RSA数字签名是一种广泛应用于网络安全中的加密技术,它是基于RSA公钥密码体制的一种非对称加密算法。在这个计算机课程设计中,我们将深入探讨如何使用MATLAB来实现RSA数字签名的生成与验证...
**支付宝RSA签名认证工具详解** 在电子商务和移动支付领域,安全是至关重要的。支付宝作为中国领先的第三方支付平台,为了确保交易的安全性,采用了一种强大的加密技术——RSA(Rivest-Shamir-Adleman)算法进行...
RSA 加密算法详解 RSA 加密算法是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA 以它的三个发明者 Ron Rivest, Adi Shamir, Leonard Adleman 的名字首字母命名,这个算法经受住了多年深入...
**支付宝RSA签名验签工具详解** 在现代电子商务和移动支付领域,安全性是至关重要的。支付宝作为全球领先的支付平台,为了确保交易的安全性,采用了RSA加密算法进行签名和验签操作。RSA是一种非对称加密算法,它...
**PHP版RSA加密算法详解** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于网络安全领域,如数据传输保护、数字签名等。在PHP中实现RSA加密,可以帮助开发者增强应用的安全性。本文将详细介绍如何在...
"数字签名算法,c++实现,RSA的算法" 指的是使用C++编程语言实现的一种基于RSA公钥加密算法的数字签名技术。RSA是一种非对称加密算法,它在信息安全领域中广泛应用,特别是在数字签名、数据加密和身份验证等方面。 ...
RSA加密算法是一种基于非对称加密技术的加密方法,由罗纳德·李维斯特(Ron Rivest)、阿迪·...RSA算法的应用不仅仅限于加密通信,还广泛应用于数字签名、证书认证等多个方面,是现代信息安全体系不可或缺的一部分。
**RSA算法详解** RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,它的全称取自这三位发明者的名字首字母。RSA算法的独特之处在于它使用一对密钥进行加密和解密,即公钥和私钥,...
### Python 实现 RSA 加密算法详解 #### 一、引言 RSA 加密算法是一种非对称加密技术,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 在 1977 年提出,因此取名为 RSA。该算法的安全性基于大数分解的数学难题。在...
**RSA加密算法详解** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,它是现代密码学的基石之一。该算法基于大整数因子分解的困难性,为数据传输提供...
**支付宝RSA签名验签工具详解** 在现代网络安全中,数据的加密和签名是保障交易安全的重要环节。支付宝作为中国领先的第三方支付平台,为开发者提供了RSA签名验签工具,旨在确保交易过程中信息的完整性和不可篡改性...
- 签名与验签:对请求数据生成RSA签名,并验证支付宝返回的签名。 - 文件操作:可能支持对证书和私钥文件的导入导出。 5. **使用步骤** - 安装工具:解压文件并安装在Windows环境下。 - 导入公钥和私钥:商户...
**RSA算法详解** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,由其发明者的名字首字母命名。该算法基于大数因子分解的困难性,用于公钥加密和数字签名。RSA的核心包括一对密钥:公钥和私钥。任何人都可以...
### RSA算法的C++实现详解 #### 概述 RSA算法是现代密码学中的一个重要组成部分,它是由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家于1978年提出的,并以其名字首字母命名。RSA算法是首个能够同时支持数据...
**RSA算法标准与OAEP加密机制详解** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,由三位美国科学家在1977年提出,是目前应用最广泛的公钥加密技术之一。它基于大整数因子分解的困难性,即对于一个大整数N,...