百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

「Java工具类」rsa非对称加密java非对称加密rsa工具类

suiw9 2025-02-08 12:49 36 浏览 0 评论

介绍语

本号主要是Java常用关键技术点,通用工具类的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!

望各位码友点击关注,冲1000粉。后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们冲啊

如果码友觉得代码太长,可以从头到尾快速扫射一遍,了解大概即可。觉得有用后再转发收藏,以备不时之需。

正文:

前面发了一篇aes对称加密工具类,深得码友信赖,帮助我转发,非常感谢码友。今天再给出一篇rsa非对称加密工具类。在java中对称加密和非对称加密都是常用的,一般情况下对称加密用于大量数据加密,比rsa快;而rsa一般用于特别重要的小量数据加密,例如密码等可以用rsa加密,把公钥给客户端,密码使用md5加密,然后再使用公钥进行加密,最后传输到后端,后端使用私钥解密,得到密码的md5值,最后与库中密码比较,相等则登录成功,反之登录错误。

rsa的公钥私钥,一般不会每次都生成,而是生成后存储在文件中或者存储在数据库中,可多次使用。

使用例子

 import com.javabage.tools.utils.RSAEncryptUtil;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.crypto.BadPaddingException;
 import javax.crypto.IllegalBlockSizeException;
 import javax.crypto.NoSuchPaddingException;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
 import java.security.spec.InvalidKeySpecException;
 
 public class RSAEncryptUtilTest {
 
     private static final Logger logger = LoggerFactory.getLogger(RSAEncryptUtilTest.class);
 
     @Test
     public void rsaTest() throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException,
         InvalidKeySpecException, BadPaddingException, InvalidKeyException {
         // 生成公钥和私钥
         RSAEncryptUtil.genKeyPair();
 
         logger.info("公钥为:{}", RSAEncryptUtil.getRSAPublicKey());
         logger.info("私钥为:{}", RSAEncryptUtil.getRSAPrivateKey());
 
         // 加密字符串,用公钥加密,用私钥解密
         String message = "kd35734j74kjffy9r";
         logger.info("待加密字符串:{}", message);
         String messageEn = RSAEncryptUtil.encrypt(message, RSAEncryptUtil.getRSAPublicKey());
         logger.info("公钥加密后的字符串为:{}", messageEn);
         String messageDe = RSAEncryptUtil.decrypt(messageEn, RSAEncryptUtil.getRSAPrivateKey());
         logger.info("私钥解密还原后的字符串为:{}", messageDe);
     }
 }
 
 // 控制台输出
 23:57:58.822 [main] INFO  - 公钥为:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnm4rf1ukashv7J+mtLyOyVfK7vZxHtNxaUJxfkGnVVOrI/M5fNhHNfl6wtUi8XislP7t5/sF4zdJgLDZ4reIma8SVueaSX85Ts/bXMLBUvVk/noSzhD3Fa+qSpcgv59NlWNNJclssZFK2bRS6NOdmIIWP/V+Ld25RrKZDahxu6dPldFPgEXAhS7C3LgdoAwTsNTAqDgPYVscVStXtFCudFWyNrVhmzCHTfSRF5+CbPH+HlnmoLje+s0pY9eVA46QKCzYVstjFarnPh4TdqRb4CQ51KEFBgyaRiNSrCskbpgZDtPjSlfdjqy48UU4fei7w9PVF34e+g8PYSwS9OPX5wIDAQAB
 23:57:58.823 [main] INFO  - 私钥为:MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCebit/W6RqyG/sn6a0vI7JV8ru9nEe03FpQnF+QadVU6sj8zl82Ec1+XrC1SLxeKyU/u3n+wXjN0mAsNnit4iZrxJW55pJfzlOz9tcwsFS9WT+ehLOEPcVr6pKlyC/n02VY00lyWyxkUrZtFLo052YghY/9X4t3blGspkNqHG7p0+V0U+ARcCFLsLcuB2gDBOw1MCoOA9hWxxVK1e0UK50VbI2tWGbMIdN9JEXn4Js8f4eWeaguN76zSlj15UDjpAoLNhWy2MVquc+HhN2pFvgJDnUoQUGDJpGI1KsKyRumBkO0+NKV92OrLjxRTh96LvD09UXfh76Dw9hLBL049fnAgMBAAECggEBAJotmMMOSglpGhLqo29L+KDUgTbgOeHH35yR/qTh+5g8HlaUAqQOTe6m5OLqTGE2EK3HEXsqfOZMDYnhkYjjF1qIV46fQTS5TOn3ugChv0WebjSAVACZ3fsKwuxn+oTA4N26j39wcAi13mPS6sSN+9ZI8qI3pB26ou28LNpvzI7SkbMmaDwmKWtPvzxSipwHshdHno6fm72LSKqGRm49w0hEkZcjuLJG+l4Y9V0o57q7ENUZU8kDIyDi9PvzVO78T565pjLQoa7ePt29M2PUZM5/EhaiHM/QWjQnozd97wZPf6yB/B9OPxGyK0s1qcZAQ95dXywQ/8PO3xK0DZ4myzECgYEAzqrMK2XbrM5gDxzgAXAzapwq4AZBg9ZU1+U2VX2zjv5DUlWDDPvK4bUQstGGdH7EGJCYcddayhqwpcqdN5gsVna/hxwdrUemgYiaJ701WRQ1dhFsHidEWt4JikuSlGPNQIt7CzKFD9wocuRWZndeTUnSM8PRIxyFRXyEUlUMr0MCgYEAxD+sXREJR2pgraXf/2u7m3INfNZoh/EkgeQqFb42GnvcRoNKJE2UHAULQUnvISJr23x0fVvlZfsNcDMav2oDkxpi0joQqt1kCskkpEvlAGzBSNt9dbGnLEIY92ZhINj0EZ14lWy1WxmdBP7O3Zof4KFKJ9XvU59gRerGqIo+cI0CgYBryBGw9G9LwVnBp/p/ZYe7KvUFXt3eJvKaofTjQypZAewUTXqKU+rsKaUqzTFFIjOc6BRJEtpLmv3TiUbTDq7Y7RdYHGaxzzNcTOSwovHmoi57g/ySAUKZ7UCmemFYuG/8IIIsRc21hsklmkYhLFHnFv/kdVRl7mLm6ViNI8P4xwKBgE9zB7DVyM/kvScP1FNvphAUaGl10/PVKFZ9rJwI2ZZ3NoJFfKqdzaxaTmgsKmdbrBa7l914arKSpKobxmRf4vqW4BMD9uN1pZ7IN9Fb+GXnoYiBc5VGSsucJsdh50iJDKZk/gBgdjtfbzYqgk0srGMgaQkfjzhneW5U0gBBl22xAoGBAMwuQSyDIynhiXZadhfkDr02ThZTAhG34J0+KdqDMjHHlMYCsq0chYZ8cNyES2E9UClui05WUL6tK7mzzBrUku8XsdlHAONA2YOCUdW9metjRldX9PfVXNcctFem9l3X07dV8Kv2CaF0V2GXYxWoik1QNmItVV/aP9DUCOriD2tn
 23:57:58.823 [main] INFO  - 待加密字符串:kd35734j74kjffy9r
 23:57:59.979 [main] INFO  - 公钥加密后的字符串为:kpa3L/GH0RUyGUmFojEeLfHxzs1EU2/Pn9to6JaUKqo1HH3o7jk6ETrhyblfQ5pjE5Ic20NiUJokAHN6EYjpBofR8XT9WdzPiW2cdUf9OLVazFyKm8wOzESzpfF+BTx67Sy7pQUxVJgUXasjdjAAElyCtxzV69/Tk03+gbIhoeGQELn//7fsA3wXJqMQLrXhbXT6vN4a0ya3D8UYiIyT3upWQUHlABEfmx63nXOaigvqjBTOunyuHSMSOYaNIC4bvkhWTQIaotWPvDy9Ra9lvmOwbRg/FvU/QYjYxWYEYz5EYeNCGiKG477E5eGW8xs1LVyqkPbqMsmovYgrvWk5PQ==
 23:57:59.986 [main] INFO  - 私钥解密还原后的字符串为:kd35734j74kjffy9r

工具类源码:

 import org.apache.commons.codec.binary.Base64;
 
 import javax.crypto.BadPaddingException;
 import javax.crypto.Cipher;
 import javax.crypto.IllegalBlockSizeException;
 import javax.crypto.NoSuchPaddingException;
 import java.nio.charset.StandardCharsets;
 import java.security.*;
 import java.security.interfaces.RSAPrivateKey;
 import java.security.interfaces.RSAPublicKey;
 import java.security.spec.InvalidKeySpecException;
 import java.security.spec.PKCS8EncodedKeySpec;
 import java.security.spec.X509EncodedKeySpec;
 import java.util.HashMap;
 import java.util.Map;
 
 /**
  * rsa工具类
  *
  * @author liangxn
  */
 public class RSAEncryptUtil {
 
     private static final Map KEY_MAP = new HashMap<>();
 
     private RSAEncryptUtil() {
     }
 
     /**
      * 随机生成密钥对
      *
      * @throws NoSuchAlgorithmException
      */
     public static void genKeyPair() throws NoSuchAlgorithmException {
         // 密钥生成器
         KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
         // 设置为2048位长度
         generator.initialize(2048, new SecureRandom());
         // 生成密钥对
         KeyPair keyPair = generator.generateKeyPair();
         // 获取私钥
         RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
         // 获取公钥
         RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
         // 进行64位编码得到公钥的字符串
         String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
         // 进行64位编码得到私钥的字符串
         String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
         // 将公钥和私钥保存到Map
         KEY_MAP.put("publicKey", publicKeyString);
         KEY_MAP.put("privateKey", privateKeyString);
     }
 
     /**
      * RSA公钥加密
      *
      * @param source    待加密字符串
      * @param publicKey 公钥
      * @return 加密后的字符串
      * @throws Exception 加密过程中的异常信息
      */
     public static String encrypt(String source, String publicKey) throws NoSuchAlgorithmException,
         InvalidKeySpecException,
         NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
         // 把字符串转成字节
         byte[] decoded = Base64.decodeBase64(publicKey);
         RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA")
             .generatePublic(new X509EncodedKeySpec(decoded));
         // rsa实例
         Cipher cipher = Cipher.getInstance("RSA");
         // 加密模式为加密,然后加密
         cipher.init(Cipher.ENCRYPT_MODE, pubKey);
         return Base64.encodeBase64String(cipher.doFinal(source.getBytes(StandardCharsets.UTF_8)));
     }
 
     /**
      * RSA私钥解密
      *
      * @param encText    加密字符串
      * @param privateKey 私钥
      * @return 解密后的字符串
      * @throws Exception 解密过程中的异常信息
      */
     public static String decrypt(String encText, String privateKey) throws NoSuchAlgorithmException,
         InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException,
         BadPaddingException {
         // 把字符串转成字节
         byte[] inputByte = Base64.decodeBase64(encText.getBytes(StandardCharsets.UTF_8));
         byte[] decoded = Base64.decodeBase64(privateKey);
         // 获取rsa密钥实例
         RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA")
             .generatePrivate(new PKCS8EncodedKeySpec(decoded));
         // rsa实例
         Cipher cipher = Cipher.getInstance("RSA");
         // 加密模式为解密,然后解密
         cipher.init(Cipher.DECRYPT_MODE, priKey);
         return new String(cipher.doFinal(inputByte));
     }
 
     public static String getRSAPrivateKey() {
         return KEY_MAP.get("privateKey");
     }
 
     public static String getRSAPublicKey() {
         return KEY_MAP.get("publicKey");
     }
 
 }

鄙人编码十年多,在项目中也积累了一些工具类,很多工具类在每个项目都有在用,很实用。大部分是鄙人封装的,有些工具类是同事封装的,有些工具类已经不记得是ctrl+c的还是自己封装的了,现在有空就会总结项目中大部分的工具类,分享给各位码友。如果文章中涉及的代码有侵权行为请通知鄙人处理。

计划是先把工具类整理出来,正所谓工欲善其事,必先利其器。项目中不管是普通单体项目还是多模块maven项目或是分布式微服务,一部分功能模块都是可以重用的,工具类模块就是其中之一。

相关推荐

俄罗斯的 HTTPS 也要被废了?(俄罗斯网站关闭)

发布该推文的ScottHelme是一名黑客,SecurityHeaders和ReportUri的创始人、Pluralsight作者、BBC常驻黑客。他表示,CAs现在似乎正在停止为俄罗斯域名颁发...

如何强制所有流量使用 HTTPS一网上用户

如何强制所有流量使用HTTPS一网上用户使用.htaccess强制流量到https的最常见方法可能是使用.htaccess重定向请求。.htaccess是一个简单的文本文件,简称为“.h...

https和http的区别(https和http有何区别)

“HTTPS和HTTP都是数据传输的应用层协议,区别在于HTTPS比HTTP安全”。区别在哪里,我们接着往下看:...

快码住!带你十分钟搞懂HTTP与HTTPS协议及请求的区别

什么是协议?网络协议是计算机之间为了实现网络通信从而达成的一种“约定”或“规则”,正是因为这个“规则”的存在,不同厂商的生产设备、及不同操作系统组成的计算机之间,才可以实现通信。简单来说,计算机与网络...

简述HTTPS工作原理(简述https原理,以及与http的区别)

https是在http协议的基础上加了一层SSL(由网景公司开发),加密由ssl实现,它的目的是为用户提供对网站服务器的身份认证(需要CA),以至于保护交换数据的隐私和完整性,原理如图示。1、客户端发...

21、HTTPS 有几次握手和挥手?HTTPS 的原理什么是(高薪 常问)

HTTPS是3次握手和4次挥手,和HTTP是一样的。HTTPS的原理...

一次安全可靠的通信——HTTPS原理

为什么HTTPS协议就比HTTP安全呢?一次安全可靠的通信应该包含什么东西呢,这篇文章我会尝试讲清楚这些细节。Alice与Bob的通信...

为什么有的网站没有使用https(为什么有的网站点不开)

有的网站没有使用HTTPS的原因可能涉及多个方面,以下是.com、.top域名的一些见解:服务器性能限制:HTTPS使用公钥加密和私钥解密技术,这要求服务器具备足够的计算能力来处理加解密操作。如果服务...

HTTPS是什么?加密原理和证书。SSL/TLS握手过程

秘钥的产生过程非对称加密...

图解HTTPS「转」(图解http 完整版 彩色版 pdf)

我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。...

HTTP 和 HTTPS 有何不同?一文带你全面了解

随着互联网时代的高速发展,Web服务器和客户端之间的安全通信需求也越来越高。HTTP和HTTPS是两种广泛使用的Web通信协议。本文将介绍HTTP和HTTPS的区别,并探讨为什么HTTPS已成为We...

HTTP与HTTPS的区别,详细介绍(http与https有什么区别)

HTTP与HTTPS介绍超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的...

一文让你轻松掌握 HTTPS(https详解)

一文让你轻松掌握HTTPS原文作者:UC国际研发泽原写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。...

如何在Spring Boot应用程序上启用HTTPS?

HTTPS是HTTP的安全版本,旨在提供传输层安全性(TLS)[安全套接字层(SSL)的后继产品],这是地址栏中的挂锁图标,用于在Web服务器和浏览器之间建立加密连接。HTTPS加密每个数据包以安全方...

一文彻底搞明白Http以及Https(http0)

早期以信息发布为主的Web1.0时代,HTTP已可以满足绝大部分需要。证书费用、服务器的计算资源都比较昂贵,作为HTTP安全扩展的HTTPS,通常只应用在登录、交易等少数环境中。但随着越来越多的重要...

取消回复欢迎 发表评论: