当前位置: 首页 > news >正文

RSA非对称加密

调试文档:https://calctools.online/zh/crypto/rsa
vue端

  1. 安装jsencrypt
npm install jsencrypt
  1. 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)
}
  1. 使用
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 ? '通过' : '失败')

小程序端

  1. 安装小程序对应的rsa专用包
npm install wxmp-rsa
  1. 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
}
  1. 使用同上

提供个高级安全方案(RSA+AES混合加密)

  1. 前端生成随机AES密钥(会话级)
  2. 用后端RSA公钥加密AES密钥
  3. 传输加密后的AES密钥和用该密钥加密的业务数据
  4. 后端用RSA私钥解密获取AES密钥,再解密业务数据
http://www.dtcms.com/a/321878.html

相关文章:

  • 除了腾讯会议,私有化有哪些选择?
  • 安科瑞EMS3.0源网荷储一体化解决方案 全面助力零碳园区建设
  • FreeSWITCH parse-all-invite-headers
  • 记一次lombok链式调用引发EasyExcel兼容性的问题
  • 记录网站突然报错503
  • 第六章第四节 PWM驱动LED呼吸灯 PWM驱动舵机 PWM驱动直流电机
  • 计算机网络:到底什么是可变长子网掩码VLSM?
  • win11中Qt5.14.0+msvc2019+opencv4.9配置
  • 全方位无限随机地图实现指南
  • 模块 PCB 技术在未来通信领域的创新突破方向
  • Docker 创建镜像错误记录
  • Java技术栈/面试题合集(21)-Docker篇
  • 如何动态执行 JS 脚本
  • 揭秘Java synchronize:轻量级锁升级与偏向锁
  • Java-注解
  • 重新 mybatis plus 的 撒着OrUpdate 方法,实现根据自定义字段插入或者修改
  • P1044 [NOIP 2003 普及组] 栈
  • B4263 [GESP202503 四级] 荒地开垦 题解
  • 【工作笔记】Docker Desktop一直转圈加载不出来然后报错
  • 提升LLM服务效率的秘密武器——vLLM!
  • Docker 安装 Redis
  • 机柜中不同类型板卡的操作系统配置情况一览
  • 解决苍穹外卖项目中 MyBatis - Plus 版本冲突问题
  • 【Linux运维】深入理解Cookie与Session机制:安全性与性能的平衡艺术
  • SAP接口日志查询
  • 多级缓存架构:新品咖啡上线引发的数据库压力风暴与高并发实战化解方案
  • 数据返回后需要刷新才会展示的解决方法
  • Vue3 组合式API
  • 飞算JavaAI深度解析:专为Java生态而生的智能引擎
  • 快速了解svm算法