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

2023-10-07 01:20

本文主要是介绍前(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'));
};

这篇关于前(jsencrypt)后(node-rsa/crypto)端 RSA 加密与解密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/155198

相关文章

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

使用Java实现Navicat密码的加密与解密的代码解析

《使用Java实现Navicat密码的加密与解密的代码解析》:本文主要介绍使用Java实现Navicat密码的加密与解密,通过本文,我们了解了如何利用Java语言实现对Navicat保存的数据库密... 目录一、背景介绍二、环境准备三、代码解析四、核心代码展示五、总结在日常开发过程中,我们有时需要处理各种软

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/