RSA非对称加密
调试文档:https://calctools.online/zh/crypto/rsa
vue端
- 安装jsencrypt
npm install jsencrypt
- rsa.js
// RSA加密AES密钥(需安装jsencrypt)
import { JSEncrypt } from 'jsencrypt' // rsa包
import CryptoJS from 'crypto-js'
const privateKey = ``// 加密
export function encryptWithRSA(data) {const encryptor = new JSEncrypt()const dataStr = typeof data === 'string' ? data : JSON.stringify(data)encryptor.setPublicKey(import.meta.env.VITE_APP_RAS_PUBLICKEY) // 公钥自己设置return encryptor.encrypt(dataStr)
}
// 解密
export function decryptWithRSA(data){const encryptor = new JSEncrypt()encryptor.setPrivateKey(privateKey)return encryptor.decrypt(data)
}// 私钥加签
export function addWithRSA(data){const encrypt = new JSEncrypt()const dataStr = typeof data === 'string' ? data : JSON.stringify(data)// 设置私钥encrypt.setPrivateKey(privateKey)// 用私钥给明文加签,例子中使用SHA256算法,具体情况具体调整return encrypt.sign(dataStr, CryptoJS.SHA256, 'sha256')
}/**
*验签
*data: 原始数据
*signature:签名
*/
export function verifyWithRSA(data, signature) {const encrypt = new JSEncrypt()const dataStr = typeof data === 'string' ? data : JSON.stringify(data)encrypt.setPublicKey(import.meta.env.VITE_APP_RAS_PUBLICKEY)return encrypt.verify(dataStr,signature,CryptoJS.SHA256)
}
- 使用
const sensitiveData = {username: 'admin',cardNo: '1234567890123456'}
const encryptrsa = encryptWithRSA(sensitiveData) // rsa加密
const decryptrsa = decryptWithRSA(encryptrsa) // rsa解密
console.log('rsa加解密:', encryptrsa, decryptrsa)const addRSA = addWithRSA(sensitiveData) // rsa加签
console.log('rsa加签:', addRSA)
const isValid = verifyWithRSA(sensitiveData, addRSA) // rsa验签
console.log('验签结果:', isValid ? '通过' : '失败')
小程序端
- 安装小程序对应的rsa专用包
npm install wxmp-rsa
- rsa.js
// ras非对称加密
const CryptoJS = require('crypto-js')
import WxmpRsa from 'wxmp-rsa'
const encryptor = new WxmpRsa();const app = getApp()
const privateKey = `` // 私钥
// 加密
const encryptWithRSA = (data) => {const dataStr = typeof data === 'string' ? data : JSON.stringify(data)encryptor.setPublicKey(app.globalData.RAS_PUBLICKEY) // 公钥自定义return encryptor.encryptLong(dataStr)
}// 解密
const decryptWithRSA = (data) => {encryptor.setPrivateKey(privateKey)return encryptor.decryptLong(data)
}// 私钥加签
const addWithRSA = (data) => {const dataStr = typeof data === 'string' ? data : JSON.stringify(data)// 设置私钥encryptor.setPrivateKey(privateKey)// 用私钥给明文加签,例子中使用SHA256算法,具体情况具体调整try {const signature = encryptor.sign(dataStr, CryptoJS.SHA256, 'sha256')if (signature === false) {console.error('签名生成失败,请检查私钥格式');}return signature} catch (error) {console.error('签名失败:', error)return null;}
}// 验签
const verifyWithRSA = (data, signature) => {const dataStr = typeof data === 'string' ? data : JSON.stringify(data)encryptor.setPublicKey(app.globalData.RAS_PUBLICKEY)return encryptor.verify(dataStr, signature, CryptoJS.SHA256)
}module.exports = {encryptWithRSA,decryptWithRSA,addWithRSA,verifyWithRSA
}
- 使用同上
提供个高级安全方案(RSA+AES混合加密)
- 前端生成随机AES密钥(会话级)
- 用后端RSA公钥加密AES密钥
- 传输加密后的AES密钥和用该密钥加密的业务数据
- 后端用RSA私钥解密获取AES密钥,再解密业务数据