前(jsencrypt)后(node-rsa/crypto)端 RSA 加密与解密

前端使用 jsencrypt 进行加密,服务端使用 node-rsa 或 crypto 进行解密。

jsencrypt 加密

需要注意的是 RSA 加密的数据长度是有限制的,过长的数据可能导致解密失败。允许的数据长度与密钥长度成正比。

import JSEncrypt from 'jsencrypt';// 通过 node-rsa 或 crypto 生成的公钥,也可以其他方式生成,只要与私钥成对即可
const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
MIIBIjA
......
owIDAQAB
-----END PUBLIC KEY-----
`;/*** 对数据进行 RSA 加密,加密失败时会返回 false。** JSEncrypt 只能加密字符串数据,因此使用 JSON.stringify 对要加密的数据进行序列化** 但此时需要注意一些 JSON.stringify 的问题**      比如:JSON.stringify(undefined) => undefined // 这不是一个字符串*      比如:JSON.stringify({ prop: undefined }) => '{}'*      比如:JSON.stringify(NaN) => 'null'** @param {string | number | Object | Array} data 需要加密的数据* @param {string} publicKey 公钥,可选* @returns {string | false} 密文*/
export const EncryptByRSA = (data, publicKey = PUBLIC_KEY) => {const encrypt = new JSEncrypt();encrypt.setPublicKey(publicKey);return encrypt.encrypt(JSON.stringify(data));
};/*** 对密文进行 RSA 解密,秘钥不对会返回 false,数据不是加密后的密文会返回 null。** 会使用 JSON.parse 对解密后数据进行反序列化** @param {string} secretText 待解密的字符串* @param {string} privateKey 私钥* @returns {any} 解密后的数据*/
export const DecryptByAES = (secretText, privateKey) => {const decrypt = new JSEncrypt();decrypt.setPrivateKey(privateKey);return JSON.parse(decrypt.decrypt(secretText));
};

crypto 解密

需要注意的是解密时需要设置正确的 padding,否则可能无法对 jsencrypt 加密的数据进行解密。

import crypto from 'crypto';/*** 生成 RSA 公私钥对* @return {Object} { publicKey, privateKey }*/
export const generateRSAKeyPair = () => {const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {modulusLength: 2048, // 秘钥长度// 秘钥配置,详见 https://nodejs.cn/dist/latest-v18.x/docs/api/crypto.html#keyobjectexportoptionspublicKeyEncoding: {type: 'spki', // 编码类型format: 'pem' // 编码格式},privateKeyEncoding: {type: 'pkcs8',format: 'pem'}});return { publicKey, privateKey };
};/*** 使用公钥进行加密,加密出错会抛出异常* @param {any} data 需要加密的数据,会使用 JSON.stringify 序列化* @param {string} publicKey* @return {string} 加密后的密文*/
export const encrypt = (data, publicKey) => {const dataJSON = JSON.stringify(data);return crypto.publicEncrypt(publicKey, Buffer.from(dataJSON, 'utf-8')).toString('base64');
};/*** 使用私钥进行解密,解密出错会抛出异常* @param {string} secretText 密文* @param {string} privateKey 私钥* @return {String} 解密后的明文,会使用 JSON.parse 反序列化*/
export const decrypt = (secretText, privateKey) => {const dataStr = crypto.privateDecrypt({key: privateKey,// padding 的值需要与公钥的编码类型相对应padding: crypto.constants.RSA_PKCS1_PADDING},Buffer.from(secretText, 'base64')).toString('utf-8');return JSON.parse(dataStr);
};

node-rsa 解密

import NodeRSA from 'node-rsa';/*** 生成 RSA 公私钥对* @return {Object} { publicKey, privateKey }*/
export const generateRSAKeyPair = () => {const key = new NodeRSA({ b: 512 }); // 指定密钥长度key.setOptions({ encryptionScheme: 'pkcs1' }); // 指定加密格式const publicKey = key.exportKey('pkcs8-public-pem'); //制定输出格式const privateKey = key.exportKey('pkcs8-private-pem');return { publicKey, privateKey };
};/*** 使用公钥进行加密,加密出错会抛出异常* @param {any} data 需要加密的数据,会使用 JSON.stringify 序列化* @param {string} publicKey* @return {string} 加密后的密文*/
export const encrypt = (data, publicKey) => {const encrypt = new NodeRSA(publicKey, 'pkcs8-public-pem');encrypt.setOptions({ encryptionScheme: 'pkcs1' });return encrypt.encrypt(JSON.stringify(data), 'base64');
};/*** 对密文进行 RSA 解密。如果解密失败,则抛出异常* @param {string} secretText 密文* @param {string} privateKey 私钥* @return {String} 解密后的明文,会使用 JSON.parse 反序列化*/
export const decrypt = (secretText, privateKey) => {const decrypt = new NodeRSA(privateKey, 'pkcs8-private-pem');// jsencrypt 自身使用的是 pkcs1 加密方案,所以这里设置为 pkcs1decrypt.setOptions({ encryptionScheme: 'pkcs1' });return JSON.parse(decrypt.decrypt(secretText, 'utf8'));
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据源报表

1.新建报表 2.新建数据集 3.维护数据源 支持的数据库还是蛮多哈 4.选择数据源表 5.编写sql 编码:SQL数据集的标识 注:避免特殊字符和_名称:SQL数据集的名称是否集合:否为单数据;是为多数据列表,如果多条数据…

一文掌握Linux系统信息查看命令(CPU、内存、进程、网口、磁盘、硬件)

引言 大家好,欢迎来到我的技术博客!如果你是一名Linux系统管理员、开发者或者热衷于学习Linux系统的用户,那么你一定需要掌握查看系统信息的命令。在这篇博客中,我将为你介绍一些常用的Linux命令,帮助你快速了解和监控…

【Linux学习】05-2Linux上部署项目

Linux(B站黑马)学习笔记 01Linux初识与安装 02Linux基础命令 03Linux用户和权限 04Linux实用操作 05-1Linux上安装部署各类软件 05-2Linux上部署项目 文章目录 Linux(B站黑马)学习笔记前言05-2Linux上部署项目部署Springboot项目…

数据结构 2.2 单循环链表

2.单循环链表 data|next——>data|next——>data|next——>头节点 1.初始化链表 2.增加节点(头插法、尾插法) 3.删除节点 4.遍历链表 定义一个结构体,存放data域和指针域: typedef struct Node {//定义一个结构体&…

特斯拉被称为自动驾驶领域的苹果

特斯拉的自动驾驶技术无疑是居于世界上领先地位的,有人形容特斯拉是自动驾驶汽车领域的苹果。特斯拉发布的Tesla Vision系统只配备了摄像头,不依靠雷达。 这并不是特斯拉唯一和其它对手不同的地方,他们的整个战略都是基于车队和销售产品,而其大多数竞争对手则销售自…

Python数据攻略-SQL和Mongodb的CRUD方法汇总

数据仓库是现代企业和个人项目中不可或缺的一部分。它们不仅存储了大量的数据,而且提供了查询和更新这些数据的方法。在本文中将探讨两种流行的数据仓库类型:SQL(例如MySQL,PostgreSQL,SQLite)和NoSQL(特别是MongoDB)。 本文为数据分析师和数据工程师,尤其是那些刚入…

输入一个大写字母,程序根据输入字符在字母表的顺序位置n,输出一个高度为n的金字塔图形

python字母金字塔根据输入的字母输出一个字母金字塔输入一个大写字母,程序根据输入字符在字母表的顺序位置n,输出一个高度为n的金字塔图形,比如输入E时,此时 字母金字塔 # A # ABA # ABCBA # ABCDCBA # ABCDEDCBA 看到问…

DPDK系列之三十三DPDK并行机制的底层支持

一、背景介绍 在前面介绍了DPDK中的上层对并行的支持,特别是对多核的支持。但是,大家都知道,再怎么好的设计和架构,再优秀的编码,最终都要落到硬件和固件对整个上层应用的支持。单纯的硬件好处理,一个核不…

防抖和节流的实现

防抖和节流的实现 什么是防抖和节流实现防抖和节流防抖节流 防抖和节流的应用场景 什么是防抖和节流 防抖和节流是前端开发中常用的两种性能优化技术。 为什么需要防抖和节流呢? 两者目的都是为了防止某个时间段内操作频繁触发,造成性能消耗。 防抖&…

NAT+ACL+mstp小综合

三、实验一相关知识点 1,实验:NAT 综合实验 2,拓扑: 3,需求: 1),实现VLAN20 的除了20这台主机以外所有主机上网访问外网 2),实现VLAN30 的主机为奇数电脑上网 3&#…

XV6 操作系统实验

环境搭建 ubuntu 新建一个文件setup.sh,内容如下 #获取工具链 git clone --recursive https://github.com/riscv/riscv-gnu-toolchain #安装必要依赖 sudo apt-get update sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev li…

如何使用 Hotshot 通过文字生成 GIF 动画

Hotshot 是一个基于人工智能的工具,可用于通过文字生成 GIF 动画。该工具使用最新的图像生成技术来创建逼真的动画,即使是复杂的文字描述也能做到。 hotshot访问地址 使用 Hotshot 生成 GIF 动画 要使用 Hotshot 生成 GIF 动画,您需要首先…

FreeRTOS入门教程(队列详细使用示例)

文章目录 前言一、队列基本使用二、如何分辨数据源三、传输大块数据总结 前言 上篇文章我们已经讲解了队列的概念和队列相关的API函数,那么本篇文章的话就开始带大家来学习使用队列。 一、队列基本使用 这个例子将会创建三个任务,其中两个任务用来发送…

vue.js 生命周期

在页面首次加载执行顺序有如下: beforeCreate //在实例初始化之后、创建之前执行created //实例创建后执行beforeMounted //在挂载开始之前调用filters //挂载前加载过滤器computed //计算属性directives-bind //只调用一次,在指令第一次绑定到元素时调…

Leetcode 151. 反转字符串中的单词 JS版两种方法(内置API,双指针)有详细讲解 小白放心食用

🎶Leetcode 151. 反转字符串中的单词 难度:中等 ✨题目描述: 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 …

吃鸡高手亲授:玩转绝地求生,分享顶级游戏干货!

绝地求生(PUBG)自上线以来,成为了全球热门游戏。作为吃鸡行家,我将分享一些独家技巧和干货,帮助您提高游戏战斗力,享受顶级游戏作战体验! 首先,让我们谈一谈战斗力升级。想要在吃鸡游…

zabbix监控

目录 一、zabbix概述 1.zabbix是什么? 二、zabbix主要功能: 三.zabbix监控原理 四、zabbix监控对象(常用的监控程序) 五、zabbix监控模式: 六、zabbix监控架构 七、部署zabbix 一、zabbix概述 1.zabbix是什么? zabbix是一…

TI单芯片毫米波雷达代码走读(二十七)—— 角度维(3D)处理之通道间幅相一致性补偿

TI单芯片毫米波雷达1642代码走读(〇)——总纲 书接上回,我们知晓了3D处理的主要流程,相信大家都已理解基本的原理。在正式进行数据分析之前还有一步关键的步骤需要说明,即通道间的幅相一致性补偿问题。 细心的朋友可能注意到,在3D处理的的原码中有两个函数我一直没有讲:…

基于最近电平逼近的开环MMC逆变器Simulink仿真模型

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

基于SpringBoot的民宿在线预定平台

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 民宿信息管理 民宿资讯管理 民宿分类管理 用户注册 民宿信息 我的订单 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实…