前(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

相关文章

SpringBoot3使用Jasypt实现加密配置文件

《SpringBoot3使用Jasypt实现加密配置文件》这篇文章主要为大家详细介绍了SpringBoot3如何使用Jasypt实现加密配置文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... 目录一. 使用步骤1. 添加依赖2.配置加密密码3. 加密敏感信息4. 将加密信息存储到配置文件中5

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

Java实现MD5加密的四种方式

《Java实现MD5加密的四种方式》MD5是一种广泛使用的哈希算法,其输出结果是一个128位的二进制数,通常以32位十六进制数的形式表示,MD5的底层实现涉及多个复杂的步骤和算法,本文给大家介绍了Ja... 目录MD5介绍Java 中实现 MD5 加密方式方法一:使用 MessageDigest方法二:使用

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密