node加密集合(前端加密、后台解密)

news2024/11/17 12:25:47

文章目录

  • 一、`crypto `加解密
    • 生成私密钥
    • 公钥加密(也可私钥加密)
    • 私钥解密(也可公钥解密)
  • 二、`node-rsa`加解密
    • 生成公私秘钥
    • 使用公钥加密(也可私钥加密)
    • 使用私钥解密(也可公钥解密)
  • 三、前端项目使用`jsencrypt`加密
  • 秘钥文件格式存放
    • 文件
    • 引入
  • 总结
    • `如有启发,可点赞收藏哟~`



一、crypto 加解密

  • cryptonode 的内置模块无需另外安装

生成私密钥

import { generateKeyPairSync, publicEncrypt, privateDecrypt } from 'crypto'

const { publicKey, privateKey } = generateKeyPairSync('rsa', {
    modulusLength: 1024,
    publicKeyEncoding: {
        type: 'spki',
        format: 'pem'
    },
    privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem'
    }
});

在这里插入图片描述

  • 把生成的公私秘钥保存(注意-------部分也是需要的,否则报错
// 公钥
export const PUBLIC_KEY = `
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/NknF2LMwt77tg63x1KVXEz4Q
rKAGVhd9kUDxQaz6meP/Qy4OUDdDBGKanLkZ5n8e1YadxwHbR9XIUPohIvLNP3fm
tMGXO2oyq+TGQKmoAAuik4qtn7T3hwMAuKVClO3epgVmFMb9xbCufUE7N+xiKHa8
8z202y08jyQTVSdWHQIDAQAB
-----END PUBLIC KEY-----
`

// 私钥
export const PRIVATE_KEY = `
-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAL82ScXYszC3vu2D
rfHUpVcTPhCsoAZWF32RQPFBrPqZ4/9DLg5QN0MEYpqcuRnmfx7Vhp3HAdtH1chQ
+iEi8s0/d+a0wZc7ajKr5MZAqagAC6KTiq2ftPeHAwC4pUKU7d6mBWYUxv3FsK59
QTs37GIodrzzPbTbLTyPJBNVJ1YdAgMBAAECgYEAnB2y9foLs4cSN9H/PycjJ4jq
b6rBrOq1myvxHglFNgZXhJ5RCBauR+VYrGuxJVhwCbjEhCVreqGYBkk3L77dBRRS
FwBqeZanUtTBKtZ06KKwAgRzPt/BOMNn+GDqt36U/2AyUXWg1qLe5r9hLWCEau5r
Yt8vYFrBKIaxu8YKIIECQQDxmpPEbyg9uors3yJ2qf0jv6cemMOsH3An4TdIiINx
7kFD/01otwOGFVUexPJgeCsi5zsnVK0AzdrqY6z4XBiVAkEAypsJGE/cDJb66qe3
PAA+8nRqgi6VGfQ3weCHlQhTO/ho5xPZIu63MVKyMZIPJ1MXQmMVRoz2lLmApZBL
wz79aQJBAONVUalJ9pFuz33mz2TcuoZCtZuCnst8oWnE7uHfId+4Ec1LkqjvW+90
by2On4nKSLyE2xI9CLRy/oQB2iWvcqkCQQCxAIcOlV4yJYjqjkF3iuNzYB9YwieC
uCgqGeV5Xv+QifHjxyRQ72peDdgdlHPmsCHG3tdMfoRB5FouyoRV++bZAkAso9+8
rTBM9sMow4Dw/lbeQGbvqz+w2ayfWbA4s7q8eSb25gnaAGZGAJ2Yx608DoGjIOZa
e2IyCqybjWEy7ycZ
-----END PRIVATE KEY-----
`

公钥加密(也可私钥加密)

publicKey为上述生成的公钥

import { publicEncrypt } from 'crypto'

//需要加密的数据
const data = "data to crypto"
// 公钥加密过程
const encryptData = publicEncrypt(publicKey, Buffer.from(data)).toString('base64');
console.log('encode:', encryptData);

私钥解密(也可公钥解密)

PRIVATE_KEY为上述生成的秘钥
encryptData为上述加密的值

import { privateDecrypt } from 'crypto'

// 私钥解密
const decryptData = privateDecrypt(PRIVATE_KEY, Buffer.from(encryptData, 'base64'));
console.log('decode:', decryptData.toString());

二、node-rsa加解密

生成公私秘钥

import NodeRSA from 'node-rsa'
let key = new NodeRSA({ b: 1024 })
    key.setOptions({ encryptionScheme:'pkcs1'})
    
let pubkey = key.exportKey('public') //生成公钥,发给前端用于数据加密
let privkey = key.exportKey('private')//生成私钥,用于数据解密
console.log(pubkey)
console.log(privkey)

在这里插入图片描述

使用公钥加密(也可私钥加密)

需要把密码先转为base64格式,并加上'base64', 'utf8'两个传参,避免出现乱码情况

let encrypt = new NodeRSA(pubkey)
// encrypt.setOptions({ encryptionScheme: 'pkcs1' })
const pass_word = encrypt.encrypt(Buffer.from("123456"), 'base64', 'utf8')
console.log(pass_word)

使用私钥解密(也可公钥解密)

let decrypt= new NodeRSA(privkey)
// decrypt.setOptions({ encryptionScheme: 'pkcs1' })
const s = pass_word.replace(/\s+/g, '+')
const decryptPass = decrypt.decrypt(s, 'utf8')
console.log('decode:', decryptPass)

在这里插入图片描述

三、前端项目使用jsencrypt加密

在前端项目使用前面两种加密会出现报错,发现并不支持前端项目
得使用jsencrypt加密

import JSEncrypt from "jsencrypt";
const encrypt = new JSEncrypt();
encrypt.setPublicKey(PUBLIC_KEY);
console.log(encrypt.encrypt("123456"));

注意,后台解密的时候,需要确认秘钥生成格式
解密的时候需要设置对应格式,否则会出现解密失败的情况

decrypt.setOptions({ encryptionScheme: 'pkcs1' })

秘钥文件格式存放

文件

  • /src/const/secret-key/public.pem (存放公钥数据)
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwLgQqalNF4ge6PuDxmvcJtnFm
djh4YgkmKeTwve1L5gJglp/e/uRXRsBQxw0Vv0tAAIQA0sN036j5JTxGmcuxnuZ6
5Zw75jeaBQfE6+kgMD88cUnRlje3X3lMT2kRZsja+IowEvrLiUWuhV9rBPkskhxj
vJQd1A2+KaQU09lYYwIDAQAB
-----END PUBLIC KEY-----
  • /src/const/secret-key/private.pem (存放私钥数据)
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCwLgQqalNF4ge6PuDxmvcJtnFmdjh4YgkmKeTwve1L5gJglp/e
/uRXRsBQxw0Vv0tAAIQA0sN036j5JTxGmcuxnuZ65Zw75jeaBQfE6+kgMD88cUnR
lje3X3lMT2kRZsja+IowEvrLiUWuhV9rBPkskhxjvJQd1A2+KaQU09lYYwIDAQAB
AoGAaUemT55oErumeIJ4s4gyFcjDbUI6Lp4O75JbcA1fD1rsksGP2Zch5pGt/Ndm
F1fP5Pgp6cAI8v9wnynEIkBnesS0j+Ydu43b6f94CXW5BwvQjy3mmkMKDvE8MHcT
h/lEosAIFfbpHD+5Uhxu47ynQRXzP9OE5Rn//MjeAS94XtkCQQD6qOQ9r2r4SsOr
5Rqh0Fr6xZrPvV5tuO2fhe+WO1XeVXPe7Dizdlck/AyWn8fL2dUERn+KvBiUblOy
zuFbQv09AkEAs+7oaDT4pkkV1mLvb+VSIut2guzcGh5o7n3dkXEKnca9dACRMK5N
Vecp3dnbAtJJwpXMuP5eJJYEc74HH1ZGHwJAAZdQ25NhenH/C/hIUv6flTfr46Ww
E8I4v+p5utplkSO5uJCHS5xUsUdoTQx2mDSpxX0tEhRfk5GftmLZy1qBgQJAUJ/+
t6L0v94D0Pqn+2WwNkF36xajUXjK4AK6I4+ZiDUjczVF2aBguttIIUabIlqD/pMN
Ft+z44TtHcfKfTo1VQJAYcgb8uGXgZVz9fFZqAaE8I0W2JkGn4zsta+RjSwxTJj9
SHDuAXBVEeLpS4hM8CA4fHmti6A0ezqh9B3U750/DA==
-----END RSA PRIVATE KEY-----

引入

const fs = require('fs')
const path = require('path')
//读取私钥加密
const rsaS = fs.readFileSync(path.join(__dirname,'./const/secret-key/private.pem'));
console.log('rsaS_rsaS', rsaS.toString())

在这里插入图片描述


总结

如有启发,可点赞收藏哟~

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

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

相关文章

Shell三剑客:正则表达式(元字符)

一、定义:元字符字符是这样一类字符,它们表达的是不同字面本身的含义 二、分类: 1、基本正则表达式元字符 # ^ 行首定位 [rootlocalhost ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/…

洁丽雅×实在RPA丨用取数宝获取全域经营数据,成本降低80%以上

12月6日,实在智能“实力派数智先锋访谈节”邀请到洁丽雅数据部负责人韩宇轩,围绕“「取数宝」为企业带来效率提升和成本降低”的话题,为线上观众分享了洁丽雅在数字化转型过程中的实践和经验。 洁丽雅组建于2003年,前身是1986年成…

智能客服的应用——政务领域

#本文来源清华大学数据治理研究中心政务热线数智化发展报告 ,如有侵权,请联系删除。 面对地方政务热线发展所面临的挑战,数智化转型已经成为了热线系统突破当前发展瓶颈、实现整体提质增效的关键手段。《意见》中也明确指出,政务…

用友 U8总账凭证打印设置

总账--凭证打印——设置 是设置凭证打印显示的格子框,勾上就有框,去掉就没有框。

打印机怎么扫描文件到电脑?6个步骤!轻松完成!

“在工作时我经常需要用到打印机,有时候需要将部分文件扫描到电脑。但是我不是很清楚应该如何操作,有什么方法可以让打印机快速传输文件到电脑的方法吗?” 在人们的工作和学习中,打印机成了很多用户的必备工具。人们可以用它来打印…

swing快速入门(八)

注释很详细,直接上代码 上一篇 新增内容 cardLayout布局管理器 事件监听器的创建与绑定 多种布局与容器的结合使用 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class swing_test_6 {public static v…

虚幻学习笔记14—重叠和碰撞事件

一、前言 在开发应用当中两个物体的重叠和碰撞事件会经常用到,在虚幻中哲两个有很大的区别,在官方文档碰撞概述其实已经讲了怎样发生碰撞和重叠,但是还是遗漏不少注意事项合细节,主要文档写的太粗糙了,这也让我在使用的…

线性回归问题

目录 一、线性回归关键思想 1、线性模型 2、基础优化算法 二、线性回归的从零开始实现 1、生成数据集 2、读取数据集 3、初始化模型参数 4、定义模型 5、定义损失函数 6、定义优化算法 7、训练 三、线性回归的简洁实现 1、生成数据集 2、读取数据集 3、定义模型…

虚拟机/etc/fstab 变更只读模式ready-only处理

虚拟机误操作将/etc/fstab中的根目录注释掉了,重启虚机后虚机可以正常启动,但无法进行修改 # vi /etc/fstab 提示文件只读 无法进行操作 解决办法: 1、重启虚机,按e进入单用户模式 2、修改内核所在那行参数,将ro 修…

往上走^^

欢迎来到程序小院 往上走 玩法&#xff1a;转动的圆球&#xff0c;点击固定到上方的圆中即可往上走一步&#xff0c;转动超过上面圆即游戏结束&#xff0c; 往上走一步加1分&#xff0c;快去往上走吧^^。开始游戏https://www.ormcc.com/play/gameStart/218 html <canvas wi…

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 Slover 部分

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 Slover 部分 概述Solver 在多模态发言人识别中的作用Solver 在多模态发言人识别中的重要性Solver 的工作原理 二次规划二次规划的基本形式二次规划的特点二次规划在多模态发言中的应用 (我的理解) 代码详解数…

单端反激(离散系统仿真)

单端反激&#xff08;离散系统仿真&#xff09; 指令电压为0,电机微速旋转,补足指令电压。 把仿真变成离散的。 最大步长设置方法&#xff1a;如果是对于相控形式的电路&#xff0c;我觉得设置1e-4秒大概就够了&#xff0c;如果是对于斩波形式的电路&#xff0c;设置1e-6或者…

oracle数据恢复—Oracle报错“system01.dbf需要更多的恢复来保持一致性”的数据恢复案例

oracle数据库恢复环境&故障&#xff1a; 一台Windows server操作系统的服务器上部署Oracle数据库。 服务器意外断电导致oracle数据库报错&#xff0c;报错信息&#xff1a;“system01.dbf需要更多的恢复来保持一致性”。由于该oracle数据库并没有备份&#xff0c;仅有一些断…

JS数组与它的42个方法

前言 数组在js中作为一个非常重要的类型之一&#xff0c;在我们对数据处理&#xff0c;存储数据&#xff0c;条件渲染的时候经常会用到&#xff0c;所以随着ES的不断更新&#xff0c;数组的方法也是越来越多&#xff0c;也让我们使用数组对数据操作的时候&#xff0c;越来越简…

WPF实现更加灵活绑定复杂Command(使用Microsoft XAML Behaviors 库)

1、安装NuGet 2、在XAML的命名空间引入&#xff1a; xmlns:i"http://schemas.microsoft.com/xaml/behaviors" 3、使用&#xff1a; <Canvas Background"Aqua"><Rectangle Stroke"Red" Width"{Binding RectModel.RectangleWidth}…

Java数据结构篇——实现顺序表的增删查改

文章目录 1.线性表2. 顺序表2.1 顺序表结构2.2 实现顺序表接口2.3 打印顺序表2.2 实现新增元素2.3 实现查找元素2.3 获取pos位置的值2.4 删除元素2.5 获取顺序表的长度2.6 清空顺序表 3.代码在这 1.线性表 定义&#xff1a;线性表是 n 个具有相同特性的数据元素的有序序列。线…

07.CSS常用样式

CSS常用样式 1.颜色样式 颜色名 介绍 直接使用颜色对应的英文单词&#xff0c;编写比较简单 具体颜色名参考 MDN 官方文档 例子 p {color:red; }缺点 颜色名这种方式&#xff0c;表达的颜色比较单一&#xff0c;所以用的并不多 rgb或rgba 介绍 使用 红、黄、蓝 这三…

【文末送书】以企业架构为中心的SABOE数字化转型五环法

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

JVM对象创建与内存分配机制分析

对象的创建 对象创建的主要流程: 1.类加载检查 虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相应的类加…

动手学习深度学习-现代循环神经网络

门控循环单元(GRU) 重置门和更新门 重置门&#xff08;Reset Gate&#xff09;和更新门&#xff08;Update Gate&#xff09;是循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;的变体之一&#xff0c;门控循环单元&#xff08;Gated Recurrent Unit, GRU&…