SpringBoot业务开发 07、Springboot集成非对称加解密

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: SpringBoot业务开发 07、Springboot集成非对称加解密

资源


RSA,RSA2公钥私钥加密解密


支付宝在线加密:强烈推荐不报错!


初始配置


1、阿里文档


下载工具包:



2、进行安装后点击生成秘钥即可




一、vue项目使用


引入


npm install jsencrypt



import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
// 密钥对生成 http://web.chacuo.net/netrsakeypair
const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
  'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
  '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
  'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
  'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
  'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
  'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
  'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
  'UP8iWi1Qw0Y='
// 加密
export function encrypt(txt) {
  const encryptor = new JSEncrypt()
  encryptor.setPublicKey(publicKey) // 设置公钥
  return encryptor.encrypt(txt) // 对数据进行加密
}
// 解密
export function decrypt(txt) {
  const encryptor = new JSEncrypt()
  encryptor.setPrivateKey(privateKey) // 设置私钥
  return encryptor.decrypt(txt) // 对数据进行解密
}



使用


import { encrypt, decrypt } from '@/utils/jsencrypt.js'
test () {
    console.log('密码:123456')
    const num = encrypt('123456')
    console.log('加密后:' + num)
    console.log('解密后:' + decrypt(num))
},


二、Springboot集成


完整方法工具类


测试:


public static void main(String[] args) throws Exception {
    String jiami = "bZEWt/ZCs6A7WoeopCnUs7t/SEoxvF+UH4UZhZm8BzjAjZ2HFHThfu/H9G9BdktIowHXo8mQqS1n08kslgqY7aKwxyg88xZXsJ9BOY5MUAnkbQAG3luejMp4B3Eoz+nL8hMrmrh4yUyRFRIsz7/EGuIkeKLzhq9bwOQ2aZ4LgMh7/hETbQuDtF10aKMcPbwrB/8NCSaoGsQGXEUtUjJxARFXGnrtH2dP4GDfth9rtyJMfpRqXTFyhQMpXrubcI7FmyZonoHQlCPJ+2z2E8XzaQOo3H5YLBb/CVvr2JEFbCuWkvyB+dNVvRS/dYiacrd26UAO9VhzdiOuNc3ePJT4TA==";
    System.out.println(decryptByPrivateKey(jiami));
}


完整工具类:


package com.zhifeng.common.Utils;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
 * @ClassName RsaUtils
 * @Author ChangLu
 * @Date 2021/11/29 20:05
 * @Description TODO
 */
public class RsaUtils {
    private static String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmeDbWj1Kh7ndniKQmAa8i9rbSTkANguoHIwDPj5Wt5E1iX6x87E53T0z4FDb5/Fcuo8TR2zdUQZvG3TxF4KXgeJ+jNBZOgnJ/6iSjjo4D/xRFzED3xxgtmLJVJSNhvktT35p9J9rGLdscX61/Dr5DI5Fei6PmrhcEcJn7QyoHeC2LPclL7O5cyibyM6at5Ottnp6enAxIzH5PGGErFUOb1oC6RfWDu1dIjBVs4Jem4pSKTeDtwb7WkdtnBSHmWG71P5j3xPkjcu1DrFAfYzcrm16YxmFqdw8D4KrPq95iPAUFKFAame4QgYHYf++xFiYa6XAKlFAiJHZjUQrV3mISQIDAQAB";
    private static String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCZ4NtaPUqHud2eIpCYBryL2ttJOQA2C6gcjAM+Pla3kTWJfrHzsTndPTPgUNvn8Vy6jxNHbN1RBm8bdPEXgpeB4n6M0Fk6Ccn/qJKOOjgP/FEXMQPfHGC2YslUlI2G+S1Pfmn0n2sYt2xxfrX8OvkMjkV6Lo+auFwRwmftDKgd4LYs9yUvs7lzKJvIzpq3k622enp6cDEjMfk8YYSsVQ5vWgLpF9YO7V0iMFWzgl6bilIpN4O3BvtaR22cFIeZYbvU/mPfE+SNy7UOsUB9jNyubXpjGYWp3DwPgqs+r3mI8BQUoUBqZ7hCBgdh/77EWJhrpcAqUUCIkdmNRCtXeYhJAgMBAAECggEAPLmu9uqvKebgnZJYa5Zk+/Avj7Lt8WYiPrnGYd7qC+FDNnKIOXpcMoH/oetnDR6EEJ975TkCEgKvAC/jIPsJXVmLxXhHbg8E516YD4bMLwrM2ZEfTQH+7JsJhtZlD7nv9qoVmFL9SbDBG/z8RoDjXeAbbP9I7q8Irn2A09ylz7wMnyHl8grNyMf6eSerG/U1zM+LJ5s/tMv5D0Q7Y7fung/lD4lDyG39lXKymwxMNMLCzRavYiYA6Fe2fQ8baKGUVFoNNHJgHx6KmrxoXsPeMJgyO0Q+sCP0ZrPXbZLwQCm9itMFkpQ8xnwL+BSGNNr+Wrj2tK+TA+N4LFxd3u6iAQKBgQDIsHpNoXJheizOpQdcL619LT/MCXhD/rklLZzl4oV5qb/CfVEg3LqUF/h7c9RlsMvT+TpfSA+VEAoz+k8Igf45GAYkIIiDWAVfckMEnJISJfKVIN+ZYCUA8lhNa7SIgaxZnCbOczeEuOrfh0SWFxMsIdmFA7JUZm3nVebik/2dwQKBgQDESaeaGQCZuy5PVLbSAm1dAkrEOdnF4qQ5VbdcJLvKhQ98a5hFi9HmiFRrJIoUG2ePdiSr50RCZ7rgPhbvY+mkoXLalqsWmgIkitnggX0A/TJ2IDN4QZKuVWpJ2upBNCTCbuQiqg15etMXbAYEWKYHR2EjEl23HQm5lG7P1T8ciQKBgDraXhNz/AoP/SHgjYcASF1ELshUIpu2EG+Rr8hOpJvoJt8PRwJfGKwjV3BEqI3lyfBwzyhwBnnNSWCy0AiLrpTpsatYixAReQnjhTnN/Jwr2rbW/BuLcW6Uo0aZBkld1cA1pb+3VBms7Nv+XCOzwqCXkKWMTvinTSWhMGNTyPVBAoGAGAR3KIjUpPrdUMGp2QqI/S9xnI8DkY4I0Ccn13N7Mu2TFoNHz4KrPU0DH1UKPCmaQ1iOZiZXGNT+bb/LKKGODiHfHtX+uzY++t+uhyTw+bUBfqi0A4vqecBj0AOkVDQgJ1ZQPdmW6n1X5O7H0bJTJmLahOMTant4HCgIYw/RuBkCgYEAnWugBURLRAC3b7Sl4J3cAF7roJraWuqmi2iw9glf72BCuN19uvo7hBi8B1L8kKwcvpUIqISSLZfm6HQziRgxqwrDYdjUPJY/Y6ugEC0lRgOoAs22xOmW+AfQwGdXYKJf3Tp+hb9QmTDhngjyq9eU3SeL4kd11rC2veb8XyBUj6s=";
    /**
     * RSA密钥对对象
     */
    public static class RSAKeyPair {
        private String publicKey;
        private String privateKey;
        public RSAKeyPair(String publicKey, String privateKey) {
            this.publicKey = publicKey;
            this.privateKey = privateKey;
        }
        public String getPublicKey() {
            return publicKey;
        }
        public String getPrivateKey() {
            return privateKey;
        }
    }
    /**
     * 构建RSA密钥对
     *
     * @return
     * @throws NoSuchAlgorithmException
     */
    public static RSAKeyPair generateKeyPair() throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
        String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded());
        String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
        RSAKeyPair rsaKeyPair = new RSAKeyPair(publicKeyString, privateKeyString);
        return rsaKeyPair;
    }
    /**
     * 公钥加密
     *
     * @param publicKeyText
     * @param text
     * @return
     */
    public static String encryptByPublicKey(String publicKeyText, String text) throws Exception {
        X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] result = cipher.doFinal(text.getBytes());
        return Base64.encodeBase64String(result);
    }
    /**
     * 私钥解密
     *
     * @param privateKeyText
     * @param text
     * @return
     * @throws Exception
     */
    public static String decryptByPrivateKey(String text) throws Exception {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(Base64.decodeBase64(text));
        return new String(result);
    }
    /**
     * 公钥解密
     *
     * @param publicKeyText
     * @param text
     * @return
     * @throws Exception
     */
    public static String decryptByPublicKey(String publicKeyText, String text) throws Exception {
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        byte[] result = cipher.doFinal(Base64.decodeBase64(text));
        return new String(result);
    }
    /**
     * 私钥加密
     *
     * @param privateKeyText
     * @param text
     * @return
     * @throws Exception
     */
    public static String encryptByPrivateKey(String privateKeyText, String text) throws Exception {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(text.getBytes());
        return Base64.encodeBase64String(result);
    }
//    /**
//     * 公钥加密私钥解密
//     */
//    private static void test1(RSAKeyPair keyPair, String source) throws Exception {
//        System.out.println("***************** 公钥加密私钥解密开始 *****************");
//        String text1 = encryptByPublicKey(keyPair.getPublicKey(), source);
//        String text2 = decryptByPrivateKey(keyPair.getPrivateKey(), text1);
//        System.out.println("加密前:" + source);
//        System.out.println("加密后:" + text1);
//        System.out.println("解密后:" + text2);
//        if (source.equals(text2)) {
//            System.out.println("解密字符串和原始字符串一致,解密成功");
//        } else {
//            System.out.println("解密字符串和原始字符串不一致,解密失败");
//        }
//        System.out.println("***************** 公钥加密私钥解密结束 *****************");
//    }
//
//    /**
//     * 私钥加密公钥解密
//     *
//     * @throws Exception
//     */
//    private static void test2(RSAKeyPair keyPair, String source) throws Exception {
//        System.out.println("***************** 私钥加密公钥解密开始 *****************");
//        String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), source);
//        String text2 = decryptByPublicKey(keyPair.getPublicKey(), text1);
//        System.out.println("加密前:" + source);
//        System.out.println("加密后:" + text1);
//        System.out.println("解密后:" + text2);
//        if (source.equals(text2)) {
//            System.out.println("解密字符串和原始字符串一致,解密成功");
//        } else {
//            System.out.println("解密字符串和原始字符串不一致,解密失败");
//        }
//        System.out.println("***************** 私钥加密公钥解密结束 *****************");
//    }
}



快速使用

实际使用:


//2、非对称解密密码
try {
    loginBody.setPassword(RsaUtil.decryptByPrivateKey(loginBody.getPassword()));
} catch (Exception e) {
    throw new ServiceException("请不要尝试篡改密码!");
}


测试:


public static void main(String[] args) throws Exception{
    String password = "changlu";
    //使用公钥加密
    String encryptPassword = encryptByPublicKey(RsaUtil.publicKey, password);
    //传入加密过后的密码进行解密
    String decodePassword = decryptByPrivateKey(encryptPassword);
    System.out.println(decodePassword);
}


工具类:


import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
 * @ClassName RsaUtil
 * @Author ChangLu
 * @Date 4/12/2022 4:00 PM
 * @Description 非对称加解密工具类
 */
public class RsaUtil {
    private static String publicKey = "xxx";
    private static String privateKey = "xxx";
    /**
     * RSA密钥对对象
     */
    public static class RSAKeyPair {
        private String publicKey;
        private String privateKey;
        public RSAKeyPair(String publicKey, String privateKey) {
            this.publicKey = publicKey;
            this.privateKey = privateKey;
        }
        public String getPublicKey() {
            return publicKey;
        }
        public String getPrivateKey() {
            return privateKey;
        }
    }
    /**
     * 私钥解密
     *
     * @param privateKeyText
     * @param text
     * @return
     * @throws Exception
     */
    public static String decryptByPrivateKey(String text) throws Exception {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(Base64.decodeBase64(text));
        return new String(result);
    }
    /**
     * 公钥加密
     *
     * @param publicKeyText
     * @param text
     * @return
     */
    public static String encryptByPublicKey(String publicKeyText, String text) throws Exception {
        X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] result = cipher.doFinal(text.getBytes());
        return Base64.encodeBase64String(result);
    }
}


相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
7天前
|
监控 Java Nacos
使用Spring Boot集成Nacos
通过上述步骤,Spring Boot应用可以成功集成Nacos,利用Nacos的服务发现和配置管理功能来提升微服务架构的灵活性和可维护性。通过这种集成,开发者可以更高效地管理和部署微服务。
88 17
|
7天前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
46 11
|
9天前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
163 12
|
15天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
64 8
|
1月前
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
104 5
|
2月前
|
消息中间件 Java Kafka
什么是Apache Kafka?如何将其与Spring Boot集成?
什么是Apache Kafka?如何将其与Spring Boot集成?
92 5
|
2月前
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
75 1
|
3月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
219 1
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
148 62
|
1月前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
130 13