spring boot + vue3 实现RSA加密解密

一、前端部分

1、安装依赖

bash 复制代码
npm i jsencrypt

2、定义函数,进行数据加密

javascript 复制代码
import JSEncrypt from 'jsencrypt';
import { getLoginPublicKey } from '@/api/common';//获取后端公钥接口

//RSA加密
export const rsaEncryption = async (data) => {
  let res = await getLoginPublicKey();//获取公钥
  const { publicKey } = res;
  const encryptor = new JSEncrypt();
  encryptor.setPublicKey(`-----BEGIN PUBLIC KEY-----\n${publicKey}\n-----END PUBLIC KEY-----`);
  return encryptor.encrypt(data + '|timestamp|' + Date.parse(new Date()));
};

二、后端

1、maven依赖

bash 复制代码
<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.44</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>

2、执行命令生成公钥和私钥(可在windows电脑中的cmd命令窗口中执行)

获取私钥:openssl genrsa -out rsa_private.key 2048

获取公钥:openssl rsa -in rsa_private.key -pubout -out rsa_public.key

3、将秘钥文件放到resources中

4、封装工具类RsaUtil

java 复制代码
package com.example.system_manage.utils;

import cn.hutool.core.codec.Base64;
import cn.hutool.crypto.KeyUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ClassPathResource;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.security.PrivateKey;
import java.security.PublicKey;

public class RsaUtil {
    /**
     * 获取私钥
     */
    public static PrivateKey getPrivateKey() throws Exception {
        ClassPathResource classPathResource = new ClassPathResource("rsakey/rsa_private.key");
        try(InputStream inputStream = classPathResource.getInputStream()){
            String privateKeyStr=IOUtils.toString(inputStream, StandardCharsets.UTF_8)
                    .replace("-----BEGIN RSA PRIVATE KEY-----", "")
                    .replace("-----END RSA PRIVATE KEY-----", "")
                    .replaceAll("\\s", "");
            byte[] keyBytes = Base64.decode(privateKeyStr);
            return KeyUtil.generateRSAPrivateKey(keyBytes);
        }

    }

    //获取公钥
    public static String getPublicKey() {
        ClassPathResource classPathResource = new ClassPathResource("rsakey/rsa_public.key");
        try(InputStream inputStream = classPathResource.getInputStream()) {
            String result= IOUtils.toString(inputStream, StandardCharsets.UTF_8)
                    .replace("-----BEGIN PUBLIC KEY-----", "")
                    .replace("-----END PUBLIC KEY-----", "")
                    .replaceAll("\\s+", "");
            return result;
        }catch (Exception ex){
            throw new BusinessException(ex.getMessage());
        }
    }

    //解密
    public static String decrypt(String encryptedBase64) {
        try {
            //私钥
            PrivateKey privateKey = getPrivateKey();
            //公钥
            PublicKey publicKey=KeyUtil.getRSAPublicKey(privateKey);
            String content=new RSA(privateKey,publicKey).decryptStr(encryptedBase64, KeyType.PrivateKey);
            String[] contents=content.split("\\|timestamp\\|");
            if(contents.length!=2){
                throw new BusinessException("解密失败");
            }
            if(System.currentTimeMillis()-Long.valueOf(contents[1]).longValue()>3000){
                throw new BusinessException("当前无效报文");
            }
            return contents[0];
        }catch (Exception ex){
            throw new BusinessException(ex.getMessage());
        }
    }
}

5、然后就可以愉快的在代码中执行了

相关推荐
小码哥_常3 分钟前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
学长毕设3 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw4 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号5 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
努力的小雨5 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
论文复现现场5 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠6 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David6 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
excel6 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放7 小时前
Python基础语法练习题(73)
java·前端·python