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

相关文章

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

Node Linux相关安装

下载经编译好的文件cd /optwget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.gztar -xvf node-v10.15.3-linux-x64.tar.gzln -s /opt/node-v10.15.3-linux-x64/bin/npm /usr/local/bin/ln -s /opt/nod

研究人员在RSA大会上演示利用恶意JPEG图片入侵企业内网

安全研究人员Marcus Murray在正在旧金山举行的RSA大会上公布了一种利用恶意JPEG图片入侵企业网络内部Windows服务器的新方法。  攻击流程及漏洞分析 最近,安全专家兼渗透测试员Marcus Murray发现了一种利用恶意JPEG图片来攻击Windows服务器的新方法,利用该方法还可以在目标网络中进行特权提升。几天前,在旧金山举行的RSA大会上,该Marcus现场展示了攻击流程,

3.比 HTTP 更安全的 HTTPS(工作原理理解、非对称加密理解、证书理解)

所谓的协议 协议只是一种规则,你不按规则来就无法和目标方进行你的工作 协议说白了只是人定的规则,任何人都可以定协议 我们不需要太了解细节,这些制定和完善协议的人去做的,我们只需要知道协议的一个大概 HTTPS 协议 1、概述 HTTPS(Hypertext Transfer Protocol Secure)是一种安全的超文本传输协议,主要用于在客户端和服务器之间安全地传输数据

ja-netfilter的前世今生和非对称加密的欺骗原理

文章目录 ja-netfilter起源官网插件插件配置文件插件的综合应用更多用法 非对称加密欺骗原理非对称加密和数字证书激活过程和欺骗手段分析代码示例第一步:生成自签名证书脚本第二步:使用自签名证书对产品激活信息进行签名 样例数据样例激活码(注:用于代码演示,直接粘贴到JetBrains 家 IDE 中无法完成激活!不用试,肯定提示无效,无法激活!!)样例power.conf(配合ja-ne

Linux加密框架设计与实现

本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:原文作者是独孤九贱大佬 原文地址:http://bbs.chinaunix.net/thread-3627341-1-1.html

Android的登陆MD5加密

1:导入代码 public class MD5Util {private static final String TAG = "MD5Util";/**** MD5加码 生成32位md5码*/public static String string2MD5(String inStr) {Log.e(TAG, "string2MD5: -------------------------");Mess

【C#生态园】解密C# Web框架:选对框架,事半功倍

探秘C# Web开发利器:六款高性能框架与库详细解读 前言 在当今的软件开发领域,C#作为一种多用途编程语言,被广泛应用于各种类型的应用程序开发。特别是在Web开发领域,有许多优秀的C# Web框架和库,本文将对其中一些备受关注的框架进行介绍和比较,帮助读者更好地选择适合其项目需求的工具。 欢迎订阅专栏:C#生态园 文章目录 探秘C# Web开发利器:六款高性能框架与库详细解