关于RSA和AES加密

RSA非对称加密

非对称加密不能传输大数据量,但比对称加密要安全,所以传输密码一般就是用的非对称加密

接口拿到RSA公钥然后再加密之后传给后端就好了

javascript 复制代码
let crypt = new JSEncrypt();
crypt.setPublicKey(res.message);
// console.log('加密前:', data);
let encryptedPassword = crypt.encrypt(JSON.stringify(data));

AES对称加密

适合加密大量数据,加密和解密使用相同的密钥。

本地生成公钥传给后端,后端传私钥回来,vi就是取

javascript 复制代码
import { encrypt, decrypt } from '@/utils/crypto'
import JSEncrypt from 'jsencrypt';//非对称加密方法
import CryptoJS from "crypto-js";//对称加密方法

let crypt = new JSEncrypt({default_key_size: 1024})
let publicKey = crypt.getPublicKey()
let privateKey = crypt.getPrivateKey()
javascript 复制代码
if (response.code === 200) {
     crypt.setPrivateKey(privateKey)
     let ty = response.data;
     const decryptedStr = crypt.decrypt(ty);
     const list = JSON.parse(decryptedStr);
     console.log('list:', list)
     // 拿到开关配置
     isEncrypt = list?.encrypt === '1';
     console.log('数据加密已', isEncrypt ? '开启' : '关闭');
     const keyStr = (list?.key || '').trim();// 强制转换为字符串并去除前后空格
     rawKey = CryptoJS.enc.Utf8.parse(keyStr)
     console.log('私钥:', rawKey)
}

AES加密

javascript 复制代码
const encryptedData = encrypt(jsonData,rawKey); // 使用crypto-js加密
config.data = { data:encryptedData }; // 将加密后的数据作为请求体发送

AES解密

javascript 复制代码
const decryptedData = decrypt(res.data,rawKey);
res.data = JSON.parse(decryptedData);

crypto.js

javascript 复制代码
import CryptoJS from 'crypto-js';

// 从环境变量获取密钥和初始化向量
/*const rawKey = import.meta.env.VITE_APP_CRYPTO_KEY; //密钥
const key = CryptoJS.enc.Utf8.parse(rawKey);*/

// 加密
export function encrypt(message,key) {
    const iv = CryptoJS.lib.WordArray.random(16) // 生成16字节随机IV
    const encrypted = CryptoJS.AES.encrypt(message, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    })
    // 将IV与密文拼接(IV在前)
    return iv.concat(encrypted.ciphertext).toString(CryptoJS.enc.Base64)
}
// 解密
export function decrypt(ciphertext,key) {
    // 从Base64解码
    const ciphertextBytes = CryptoJS.enc.Base64.parse(ciphertext)
    // 提取前16字节作为IV
    const iv = CryptoJS.lib.WordArray.create(ciphertextBytes.words.slice(0, 4))
    // 剩余部分是实际密文
    const encrypted = CryptoJS.lib.WordArray.create(ciphertextBytes.words.slice(4))
    const decrypted = CryptoJS.AES.decrypt(
        { ciphertext: encrypted },
        key,
        {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }
    )
    return decrypted.toString(CryptoJS.enc.Utf8)
}
相关推荐
lemon_yyds24 分钟前
《vue 2 升级vue3 父组件 子组件 传值: value 和 v-model
vue.js
Kagol1 小时前
TinyVue 支持 Skills 啦!现在你可以让 AI 使用 TinyVue 组件搭建项目
前端·agent·ai编程
柳杉1 小时前
从零打造 AI 全球趋势监测大屏
前端·javascript·aigc
simple_lau1 小时前
Cursor配置MasterGo MCP:一键读取设计稿生成高还原度前端代码
前端·javascript·vue.js
睡不着先生1 小时前
如何设计一个真正可扩展的表单生成器?
前端·javascript·vue.js
天蓝色的鱼鱼1 小时前
模块化与组件化:90%的前端开发者都没搞懂的本质区别
前端·架构·代码规范
明君879971 小时前
Flutter 如何给图片添加多行文字水印
前端·flutter
leolee182 小时前
Redux Toolkit 实战使用指南
前端·react.js·redux
bluceli2 小时前
React Hooks最佳实践:写出优雅高效的组件代码
前端·react.js
IT_陈寒2 小时前
JavaScript代码效率提升50%?这5个优化技巧你必须知道!
前端·人工智能·后端