一、传输加密

这里用 对称加密模式 ASE实现。

React 前端


const CryptoJS = require("crypto-js");// 示例1:ECB模式(无需IV)
const encryptECB = (plainText, key) => {return CryptoJS.AES.encrypt(plainText, key, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7}).toString();
};const decryptECB = (cipherText, key) => {const bytes = CryptoJS.AES.decrypt(cipherText, key, {mode: CryptoJS.mode.ECB});return bytes.toString(CryptoJS.enc.Utf8);
};// 示例2:CBC模式(需要IV)
const encryptCBC = (plainText, key, iv) => {return CryptoJS.AES.encrypt(plainText, key, {iv: CryptoJS.enc.Utf8.parse(iv),mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString();
};const decryptCBC = (cipherText, key, iv) => {const bytes = CryptoJS.AES.decrypt(cipherText, key, {iv: CryptoJS.enc.Utf8.parse(iv)});return bytes.toString(CryptoJS.enc.Utf8);
};// 测试用例
const key = "my-secret-key-123"; // 16/24/32字节
const iv = "1234567890123456";   // 16字节
const text = "Hello AES!";// ECB模式
const ecbEncrypted = encryptECB(text, key);
console.log("ECB加密结果:", ecbEncrypted);
console.log("ECB解密结果:", decryptECB(ecbEncrypted, key));// CBC模式
const cbcEncrypted = encryptCBC(text, key, iv);
console.log("CBC加密结果:", cbcEncrypted);
console.log("CBC解密结果:", decryptCBC(cbcEncrypted, key, iv));

Express 中间件

解密中间件封装

创建 AES_decrypt.js 中间件文件,处理请求体的加密数据:

const { AES_decrypt } = require('../utils/AES');
const decryptMiddleware = (req, res, next) => {if (req.body?.content && req.body?.iv) {try {const decrypted = AES_decrypt(req.body.content, req.body.iv);req.decryptedData = JSON.parse(decrypted); // 存储解密结果到请求对象next();} catch (err) {res.status(400).json({ error: "解密失败" });}} else {next(); // 非加密请求跳过}
};
module.exports = decryptMiddleware;

引用自实际中间件解密实现‌

在 utils/AES.js 中定义解密函数,需与前端 CryptoJS 的 CBC 模式配置一致:

const crypto = require('crypto');
const secretKey = '1234567890123456'; // 16字节密钥function AES_decrypt(encryptedText, ivHex) {const decipher = crypto.createDecipheriv('aes-128-cbc',Buffer.from(secretKey),Buffer.from(ivHex, 'hex'));let decrypted = decipher.update(encryptedText, 'base64', 'utf8');decrypted += decipher.final('utf8');return decrypted;
}
module.exports = { AES_decrypt };

下面是ECB(无vi模式)


const crypto = require('crypto');
const secretKey = process.env.AES_KEY || 'default16byteskey!'; // 16字节密钥module.exports = (req, res, next) => {if (req.body?.encryptedData) {try {const decipher = crypto.createDecipheriv('aes-128-ecb', Buffer.from(secretKey),null // ECB模式无需IV);let decrypted = decipher.update(req.body.encryptedData, 'base64', 'utf8');decrypted += decipher.final('utf8');req.decryptedBody = JSON.parse(decrypted);next();} catch (err) {res.status(400).json({ error: "ECB解密失败", details: err.message });}} else {next(); // 非加密请求跳过}
};

二、不可逆加密

这里用bcryptjs实现

import bcrypt from 'bcryptjs';/*** 加密(不可逆转加密)* @param rawData */
export const getHashedData = (rawData: string): string => {const salt = bcrypt.genSaltSync(10); // 成本因子推荐10-12const hashedData = bcrypt.hashSync(rawData, salt); return hashedData;
}/*** 匹配不可逆转加密方式生成的数据* @param rawData * @param hashedData * @returns */
export const matchHashDataAndRawData = (rawData: string, hashedData: string): boolean => {return bcrypt.compareSync(rawData, hashedData);
} 

调用

加密

 const hashedPassword = getHashedData(password);

比对数据 

matchHashDataAndRawData(newPassword, password);

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

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

相关文章

浏览器(Chrome /Edge)高效使用 - 内部命令/快捷键/启动参数

今天在CSDN上传文件,提交总是提示续传失败,重试了五六次才想到获取是科学上网的问题,这个时候其实只要重启浏览器即可,但如果手动关闭浏览器再次打开,浏览器不会恢复之前的多开窗口(会恢复最后一个窗口内多开的标签页,但不会恢复其他窗口)。想了想记得 Chrome 流行的时…

【PTA数据结构 | C语言版】连续子序列最大和

本专栏持续输出数据结构题目集,欢迎订阅。 文章目录 题目代码 题目 给定 n 个整数组成的序列 { a1 ,a2 ,⋯,an },“连续子序列”被定义为 { ai ,ai1 ,⋯,aj },其中 1≤i≤j≤n。“连续子序列最大和”则被定义为所有连续子序列元素的和中最大…

Vrrp配置和原理

Vrrp配置和原理 文章目录Vrrp配置和原理概述物理与逻辑拓扑重点vrid虚拟路由器虚拟IP地址及虚拟MAC地址超时时间计算-MASTER_DOWNvip 管理员手动指定方法Master路由器Backup路由器PriorityVRRP报文格式VRRP状态机从Backup到masterVRRP协议状态二.优先级一样比较接口IPVRRP优先级…

可编辑59页PPT | 某大型集团人工智能数字化转型SAP解决方案

荐言摘要:某大型集团人工智能数字化转型中,SAP解决方案扮演着智能中枢角色,深度融合AI技术与核心业务场景,破解传统系统“数据孤岛流程僵化”双重困局。针对集团跨产业、多业态特点,方案以SAP S/4HANA为数据底座&#…

【RK3568 驱动开发:实现一个最基础的网络设备】

RK3568 驱动开发:实现一个最基础的网络设备一、引言二、编写网络设备驱动代码1. 核心数据结构与接口2. 核心功能实现3. 网络命名空间管理4.源代码三、编译与验证1.加载模块2.验证网络四、注意事项一、引言 RK3568 作为一款高性能 ARM 架构处理器,广泛应…

CAIDCP系列对话:AI 驱动安全

数字时代,AI浪潮翻涌,网络安全攻防战已悄然升级: 某工业控制系统遭AI驱动勒索攻击:攻击者借 AI 精准捕捉异常网络扫描、远程 PowerShell 痕迹,瞬间加密文件索要赎金; 另一边,某大型科技公司用AI…

ARMv8 没开mmu执行memset引起的非对齐访问异常

最近在haps上验证一个新的芯片,记录一下memset访问出错的问题。在没开mmu和cache的情况下,对全局变量指针进行memset清零操作,发现每次都会出现异常。最后发现是没开mmu导致出现了数据非对齐访问导致报错。排查EC区域发现是0x25,产…

基于LiveKit Go 实现腾讯云实时音视频功能

详细的生产部署建议,适用于 LiveKit Go 服务器 Web 客户端 TURN/HTTPS。 1. 服务器准备 推荐使用云服务器(如阿里云、腾讯云、AWS、Azure等),公网IP,带宽建议≥10Mbps。系统推荐 Ubuntu 20.04/22.04 或 CentOS 7/8&…

三位一体:Ovis-U1如何以30亿参数重构多模态AI格局?

1. 时代命题:多模态统一模型的破局之战当GPT-4o以万亿级参数构建多模态帝国时,中国AI军团正在书写另一种答案。Ovis-U1用30亿参数证明:参数量并非决定性因素,架构创新与训练策略的化学反应,同样能催生出改变游戏规则的…

图像处理基础:镜像、缩放与矫正

在图像处理中,镜像、缩放和矫正操作是常见的图像变换手段。这些操作可以帮助我们对图像进行调整,以满足不同的需求。本文将详细介绍这三种操作的原理和实现方法,并通过代码示例展示它们的实际应用。一、图片镜像旋转1.1 什么是镜像旋转&#…

「Java案例」猜数游戏

案例实现 猜数字游戏 设计一个三位数的猜数游戏,三位数随机生成。程序提示用户输入一个三位的数字,依照以下的规则决定赢取多少奖金:1) 如果用户输入的数字和随机数字完全一致,输出:“恭喜恭喜!完全猜对了!获得三个赞!”2) 如果用户输入的数字覆盖了随机生成的所有数…

创客匠人解析创始人 IP 内卷:知识变现时代的生存逻辑与破局路径

当知识付费行业进入 “存量竞争” 阶段,创始人 IP 的 “内卷” 已非选择而是必然。创客匠人在服务数万知识创业者的实践中发现,那些实现逆势增长的案例,其核心差异往往在于创始人是否具备 “从幕后走到台前” 的决心与能力 —— 这种内卷并非…

250705-Debian12-sudo apt update加速+配置RDP远程桌面环境+设置FRP服务为开机启动项

A. 实现sudo apt update加速 在 Debian 12 上运行 sudo apt update 很慢的常见原因包括: 🔍 一、常见原因分析 使用了国外的软件源 默认 Debian 安装源多数是国际服务器,国内访问会非常慢。 DNS 解析慢或失败 软件源地址解析时间长&#xf…

数学视频动画引擎Python库 -- Manim Voiceover 语音服务 Speech Services

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。 Manim Voiceover 是一个为 Manim 打造的专注于语音旁白的插件: 直接在 Python 中添加语音旁白: 无需使用视频编辑器&…

C++11 forward_list 从基础到精通:原理、实践与性能优化

文章目录一、为什么需要 forward_list?二、基础篇:forward_list 的核心特性与接口2.1 数据结构与迭代器2.2 常用接口速览2.3 基础操作示例:从初始化到遍历2.3.1 初始化与遍历2.3.2 插入与删除:before_begin 的关键作用三、进阶篇&…

物联网技术的核心组件与发展趋势(截至2025年)

一、物联网技术的核心组件物联网(IoT)技术体系由感知层、网络层、平台层、应用层和安全层构成,各层技术协同工作,实现物理世界与数字世界的深度融合。1. 感知层:数据采集与交互传感器技术:类型:…

面试中常见的问题:JavaScript 宏任务与微任务,包教包会

事件循环Event Loop 我们都知道,JavaScript 是一种单线程的编程语言,简单的说就是:js只有一条通道,那么在任务多的情况下,就会出现拥挤的情况,这种情况下就产生了 ‘多线程’ ,但是这种“多线程…

【LeetCode102.二叉树的层序遍历】vs.【LeetCode103.二叉树的锯齿形层序遍历】

题目链接 LeetCode102.二叉树的层序遍历:102. 二叉树的层序遍历 - 力扣(LeetCode)LeetCode103.二叉树的锯齿形层序遍历:103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode) 实现思路 定义一个队列&#xff0…

Redis On-CPU Profiling定位瓶颈到可视化火焰图

1 . 前置检查:确认 CPU 真的是瓶颈 在正式打性能“补丁”前,务必跑一遍系统级健康核对表(推荐 Brendan Greg 的 USE Method):资源关注指标常用工具CPUUtil/Idle、RunQueuetop、vmstat、sar内存Fault、Swap、Cache Miss…

未来趋势:AI与量子计算对服务器安全的影响

随着技术的飞速发展,人工智能(AI)和量子计算正在深刻改变信息技术的各个领域。特别是在服务器安全领域,这两项技术既带来了新的可能性,也带来了前所未有的挑战。本文将探讨AI和量子计算技术对服务器安全的影响&#xf…