node.js基础学习-crypto模块-加密解密(九)

一、正文

crypto模块是 Node.js 用于加密、解密、哈希等安全相关操作的核心模块。它提供了多种加密算法和哈希函数,以满足不同的安全需求。

二、哈希函数(以 MD5 和 SHA - 256 为例

MD5

虽然 MD5 现在已经被发现存在安全漏洞,但在一些非安全关键的场景下(如简单的数据完整性检查)仍可能会用到。例如,计算一个文件的 MD5 哈希值来验证文件是否被篡改:

js 复制代码
const crypto = require('crypto');
const fs = require('fs');
const fileContent = fs.readFileSync('sample.txt');
const md5sum = crypto.createHash('md5').update(fileContent).digest('hex');
console.log('MD5 hash of the file:', md5sum);

首先通过fs.readFileSync读取文件内容,然后使用crypto.createHash('md5')创建一个 MD5 哈希对象,使用update方法传入文件内容,最后通过digest('hex')方法得到十六进制格式的哈希值。

SHA - 256:

这是一种更安全的哈希函数,常用于数字签名等安全场景。例如,计算一个字符串的 SHA - 256 哈希值:

js 复制代码
const crypto = require('crypto');
const data = 'This is a sample data';
const sha256sum = crypto.createHash('sha256').update(data).digest('hex');
console.log('SHA - 256 hash:', sha256sum);

三、对称加密(以AES为例)

加密过程

对称加密使用相同的密钥进行加密和解密。在 Node.js 中,AES(Advanced Encryption Standard)是常用的对称加密算法。以下是一个使用 AES - 256 - CBC 模式加密数据的示例:

js 复制代码
const crypto = require('crypto');
const algorithm = 'aes - 256 - CBC';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);
const data = 'This is a sample data to encrypt';
const cipher = crypto.createCipheriv(algorithm, key, iv);
let encryptedData = cipher.update(data, 'utf8', 'hex');
encryptedData += cipher.final('hex');
console.log('Encrypted data:', encryptedData);

首先,定义了加密算法(algorithm)为aes - 256 - CBC,并通过crypto.randomBytes生成了 32 字节的密钥(key)和 16 字节的初始化向量(iv)。createCipheriv方法用于创建一个加密器,传入算法、密钥和初始化向量。然后使用cipher.update方法对数据进行加密,将其从 UTF - 8 格式转换为十六进制格式,最后使用cipher.final方法完成加密并将结果转换为十六进制格式。

解密过程

js 复制代码
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let decryptedData = decipher.update(encryptedData, 'hex', 'utf8');
decryptedData += decipher.final('utf8');
console.log('Decrypted data:', decryptedData);

这里使用createDecipheriv创建一个解密器,对加密数据进行解密。先使用decipher.update方法处理部分数据,将其从十六进制转换为 UTF - 8 格式,最后使用decipher.final方法完成解密并保持 UTF - 8 格式。

四、非对称加密**(以RSA 为例)**

非对称加密的原理就是得到被传输对象的公钥(publicKey)进行数据的加密操作,传输到对方后,对方通过自己的私钥(privateKey)进行解密操作。

生成密钥对

非对称加密使用一对密钥,即公钥和私钥。公钥用于加密,私钥用于解密。在 Node.js 中,可以使用crypto.generateKeyPairSync(同步方法)或crypto.generateKeyPair(异步方法)来生成 RSA 密钥对。以下是一个生成 RSA 密钥对的示例:

js 复制代码
const crypto = require('crypto');
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
    modulusLength: 2048,
});

这里生成了一个 2048 位的 RSA 密钥对,包括公钥(publicKey)和私钥(privateKey)。

加密过程

js 复制代码
const data = 'This is a sample data';
const encryptedData = crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('hex');
console.log('Encrypted data:', encryptedData);

使用公钥(publicKey)对数据进行加密,将数据转换为Buffer对象后,通过publicEncrypt方法进行加密,最后将结果转换为十六进制格式。

解密过程

js 复制代码
const decryptedData = crypto.privateDecrypt(privateKey, Buffer.from(encryptedData, 'hex')).toString('utf8');
console.log('Decrypted data:', decryptedData);

使用私钥(privateKey)对加密数据进行解密,先将十六进制格式的数据转换为Buffer对象,通过privateDecrypt方法进行解密,最后将结果转换为 UTF - 8 格式。

相关推荐
我爱cope2 小时前
【计算机网络 | 网络层11:ICMP 协议:Ping 和 Traceroute 的底层原理】
网络·学习·计算机网络
问天_观心3 小时前
大模型微调学习(一)
开发语言·人工智能·学习·语言模型·github
FungLeo3 小时前
成为全栈·Node 后端篇·配置管理:环境变量、多环境与密钥安全
node.js·环境变量·多环境配置·密钥安全
苏生Susheng3 小时前
【软件实施】Linux系统Shell脚本教程
linux·运维·服务器·chrome·spring boot·学习·实施
我命由我123454 小时前
Photoshop - Photoshop 把两个 PSD 文件合并
学习·ui·职场和发展·产品运营·产品经理·学习方法·photoshop
FungLeo4 小时前
成为全栈·Node 后端篇·错误处理:异常分层与全局捕获
node.js·错误处理·异常分层·全局捕获·成为全栈
小雪崩6 小时前
嵌入式学习 day39:TCP并发服务器模型
linux·服务器·c语言·网络·学习·tcp/ip
知识分享小能手6 小时前
深度学习学习教程,从入门到精通,概率与信息论 — 知识点详解(3)
人工智能·深度学习·学习·数据挖掘·概率论
Wendy不吃榴莲6 小时前
# AI短剧教程 - 《后西游记》开播后,AI影视为什么更考验“连续讲故事”?
人工智能·笔记·学习·ai·视频
Agudamu11616 小时前
B站学习视频怎么变笔记:用 Ai好记 + Obsidian 搭建个人知识库的完整教程
人工智能·笔记·学习·音视频