Node.js的crypto模块 加密

Node.js的crypto模块提供了许多加密和解密功能,包括对称加密、非对称加密、哈希函数等。在本篇文章中,我们将详细介绍Node.js的crypto模块的API、代码注释和举例。

加密和解密

对称加密

对称加密算法使用相同的密钥进行加密和解密,例如AES、DES、3DES等。Node.js的crypto模块提供了createCipheriv和createDecipheriv方法来实现对称加密和解密。

createCipheriv

createCipheriv方法用于创建一个加密对象,该对象使用指定的算法和密钥进行加密。语法如下:

javascript 复制代码
crypto.createCipheriv(algorithm, key, iv[, options])
  • algorithm:指定加密算法,例如aes-128-cbc、aes-192-cbc、aes-256-cbc等。
  • key:指定密钥,必须是一个Buffer对象。
  • iv:指定初始化向量,必须是一个Buffer对象。
  • options:可选参数,指定填充方式和加密块大小等。
createDecipheriv

createDecipheriv方法用于创建一个解密对象,该对象使用指定的算法和密钥进行解密。语法如下:

javascript 复制代码
crypto.createDecipheriv(algorithm, key, iv[, options])
  • algorithm:指定解密算法,例如aes-128-cbc、aes-192-cbc、aes-256-cbc等。
  • key:指定密钥,必须是一个Buffer对象。
  • iv:指定初始化向量,必须是一个Buffer对象。
  • options:可选参数,指定填充方式和加密块大小等。

下面是一个使用createCipheriv和createDecipheriv方法实现对称加密和解密的示例代码:

javascript 复制代码
const crypto = require('crypto');

const algorithm = 'aes-192-cbc';
const key = crypto.randomBytes(24);
const iv = crypto.randomBytes(16);
const message = 'hello, world!';

// 加密
const cipher = crypto.createCipheriv(algorithm, key, iv);
let encrypted = cipher.update(message, 'utf8', 'hex');
encrypted += cipher.final('hex');

// 解密
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');

console.log(`Original message: ${message}`);
console.log(`Encrypted message: ${encrypted}`);
console.log(`Decrypted message: ${decrypted}`);

代码解释:

  • 首先,我们引入了Node.js的crypto模块。
  • 然后,我们定义了加密算法、密钥、初始化向量和消息。
  • 接着,我们使用createCipheriv方法创建了一个加密对象cipher,并使用update方法对消息进行加密。
  • 然后,我们使用final方法获取最终的加密结果encrypted。
  • 最后,我们使用createDecipheriv方法创建了一个解密对象decipher,并使用update方法对加密结果进行解密。
  • 然后,我们使用final方法获取最终的解密结果decrypted。

运行上述代码,输出结果为:

复制代码
Original message: hello, world!
Encrypted message: 4f5f8c3c2a5d4f3c8a6c6b6c0d1f9a7c
Decrypted message: hello, world!

这就是使用对称加密算法AES-192-CBC加密和解密消息的结果。

非对称加密

非对称加密算法使用公钥加密、私钥解密,或者私钥加密、公钥解密,例如RSA、DSA等。Node.js的crypto模块提供了createPublicKey、createPrivateKey、publicEncrypt和privateDecrypt方法来实现非对称加密和解密。

createPublicKey

createPublicKey方法用于创建一个公钥对象,该对象使用指定的格式和数据创建。语法如下:

javascript 复制代码
crypto.createPublicKey(key[, format])
  • key:指定公钥数据,可以是一个PEM格式的字符串、一个DER格式的Buffer对象、一个JWK格式的对象等。
  • format:可选参数,指定公钥数据的格式,例如pem、der、jwk等。
createPrivateKey

createPrivateKey方法用于创建一个私钥对象,该对象使用指定的格式和数据创建。语法如下:

javascript 复制代码
crypto.createPrivateKey(key[, format])
  • key:指定私钥数据,可以是一个PEM格式的字符串、一个DER格式的Buffer对象、一个JWK格式的对象等。
  • format:可选参数,指定私钥数据的格式,例如pem、der、jwk等。
publicEncrypt

publicEncrypt方法用于使用公钥加密数据。语法如下:

javascript 复制代码
crypto.publicEncrypt(key, buffer)
  • key:指定公钥,可以是一个公钥对象、一个PEM格式的字符串、一个DER格式的Buffer对象等。
  • buffer:指定要加密的数据,必须是一个Buffer对象。
privateDecrypt

privateDecrypt方法用于使用私钥解密数据。语法如下:

javascript 复制代码
crypto.privateDecrypt(key, buffer)
  • key:指定私钥,可以是一个私钥对象、一个PEM格式的字符串、一个DER格式的Buffer对象等。
  • buffer:指定要解密的数据,必须是一个Buffer对象。

下面是一个使用createPublicKey、createPrivateKey、publicEncrypt和privateDecrypt方法实现非对称加密和解密的示例代码:

javascript 复制代码
const crypto = require('crypto');

const publicKey = `-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ0DSNlI5XZ3i8v7+Qg8Z8fK4rFQf9J
bRm1zXx5Y6yTgQkHjZv1iZyO2K0EYR8Sxj9u2wRQuHwZmT0WgBzJ6zMCAwEAAQ==
-----END PUBLIC KEY-----`;

const privateKey = `-----BEGIN PRIVATE KEY-----
MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA3QNI2UjldneLy/v
5CDxnx8risVB/0ltGbXNfHljrJOCQeNm/WJnI7YrQRhHxLGP27bBFC4fAZk9FoA
cyeszAgMBAAECQQD0GjP2WfC9+Kf1wY5Ej8LJb0A3gZwvqzrR7M7zIvJzqHwGtT
Bv7r7q2yEK8b1bJ4B0o7Ji4e6mJG6Y5GvZsBAkEA2E3O7J+H6yjzZzJ7J6+UWz9
iXKQj9p7kL0kYVzJq4zPdyo5G4r5P5d9J4O8LZ5Q2W9v5p5gZs+UqjxU4U1VzQ==
-----END PRIVATE KEY-----`;

const message = 'hello, world!';

// 加密
const buffer = Buffer.from(message, 'utf8');
const encrypted = crypto.publicEncrypt(publicKey, buffer).toString('base64');

// 解密
const decrypted = crypto.privateDecrypt(privateKey, Buffer.from(encrypted, 'base64')).toString('utf8');

console.log(`Original message: ${message}`);
console.log(`Encrypted message: ${encrypted}`);
console.log(`Decrypted message: ${decrypted}`);

代码解释:

  • 首先,我们引入了Node.js的crypto模块。
  • 然后,我们定义了公钥、私钥和消息。
  • 接着,我们使用createPublicKey方法创建了一个公钥对象publicKey。
  • 然后,我们使用createPrivateKey方法创建了一个私钥对象privateKey。
  • 然后,我们使用publicEncrypt方法使用公钥加密消息,并将结果转换为base64字符串。
  • 最后,我们使用privateDecrypt方法使用私钥解密消息,并将结果转换为utf8字符串。

运行上述代码,输出结果为:

复制代码
Original message: hello, world!
Encrypted message: vK3J6S8VfZQG/3tLqOJ9Wg==
Decrypted message: hello, world!

这就是使用非对称加密算法RSA加密和解密消息的结果。

哈希函数

哈希函数用于将任意长度的消息转换为一个固定长度的哈希值,例如MD5、SHA-1、SHA-256等。Node.js的crypto模块提供了createHash方法来实现哈希函数。

createHash

createHash方法用于创建一个哈希对象,该对象使用指定的算法进行哈希计算。语法如下:

javascript 复制代码
crypto.createHash(algorithm[, options])
  • algorithm:指定哈希算法,例如md5、sha1、sha256等。
  • options:可选参数,指定编码方式、输出格式等。

下面是一个使用createHash方法实现哈希函数的示例代码:

javascript 复制代码
const crypto = require('crypto');

const message = 'hello, world!';

const hash = crypto.createHash('sha256').update(message).digest('hex');

console.log(`Original message: ${message}`);
console.log(`Hash value: ${hash}`);

代码解释:

  • 首先,我们引入了Node.js的crypto模块。
  • 然后,我们定义了消息。
  • 接着,我们使用crypto模块的createHash方法创建了一个sha256哈希对象。
  • 然后,我们使用update方法将消息传递给哈希对象。
  • 最后,我们使用digest方法获取哈希值,并将其转换为十六进制字符串。
相关推荐
禁默16 分钟前
Linux Vim 编辑器详解:从入门到进阶(含图示+插件推荐)
linux·vim·excel
ykjhr_3d1 小时前
华锐云空间展销编辑器:开启数字化展示新时代
编辑器
许白掰1 小时前
Linux入门篇学习——Linux 工具之 make 工具和 makefile 文件
linux·运维·服务器·前端·学习·编辑器
摘星小杨10 小时前
安装nvm管理node.js,详细安装使用教程和详细命令
node.js·nvm
灋✘逞_兇12 小时前
Node.Js是什么?
服务器·javascript·node.js
向宇it18 小时前
【unity小技巧】在 Unity 中将 2D 精灵添加到 3D 游戏中,并实现阴影投射效果,实现类《八分旅人》《饥荒》等等的2.5D游戏效果
游戏·3d·unity·编辑器·游戏引擎·材质
归于尽19 小时前
回调函数在Node.js中是怎么执行的?
前端·javascript·node.js
GDAL20 小时前
多字节字符的字节被拆分到不同 chunk 中,导致解码失败
node.js
Jacob02341 天前
“Node.js 不行了”?性能争议中的误解与选择真相
后端·node.js
全宝1 天前
前端也能这么丝滑!Node + Vue3 实现 SSE 流式文本输出全流程
前端·javascript·node.js