如何在Node.js中加密和解密数据

本文翻译自How to encrypt and decrypt data in Node.js

Node.js提供了一个名为crypto的内置模块,可用于加密和解密字符串,数字,缓冲区,流等。 该模块提供了加密功能,其中包括用于OpenSSL哈希,HMAC,密码,解密,签名和验证功能的一组包装器。

在本文中,您将学习如何使用Node.js的crypto模块对数据执行加密操作。 我将向您展示如何使用秘钥加密数据,然后在需要时使用相同的秘钥解密数据。

为了简单起见,我将使用AES(高级加密系统)算法CTR加密模式。 这是有关选择正确的AES加密模式的StackOverflow的很好的讨论。

创建一个新项目

在本地文件系统中创建一个新目录,并通过键入以下命令切换到该目录:

$ mkdir crypto && cd crypto

现在执行以下命令来初始化一个新的Node.js项目:

$npm init -y

上面的命令将在根目录中创建一个新的package.json文件。 发出上述命令之前,请确保已在计算机上[安装了Node.js](https://attacomsian.com/blog/install-nodejs-npm-ubuntu)。

默认情况下,crypto模块已包含在预构建的Node.js二进制文件中。 但是,如果您手动安装了Node.js,则可能未附带crypto模块。 但是,您可以通过执行以下命令来安装它:

$ npm install crypto --save

加密和解密文本

让我们在项目的根目录中创建crypto.js文件,并定义我们的加密和解密功能,如下所示:
crypto.js

const crypto = require('crypto');

const algorithm = 'aes-256-ctr';
const secretKey = 'vOVH6sdmpNWjRRIqCc7rdxs01lwHzfr3';
const iv = crypto.randomBytes(16);

const encrypt = (text) => {

    const cipher = crypto.createCipheriv(algorithm, secretKey, iv);

    const encrypted = Buffer.concat([cipher.update(text), cipher.final()]);

    return {
        iv: iv.toString('hex'),
        content: encrypted.toString('hex')
    };
};

const decrypt = (hash) => {

    const decipher = crypto.createDecipheriv(algorithm, secretKey, Buffer.from(hash.iv, 'hex'));

    const decrpyted = Buffer.concat([decipher.update(Buffer.from(hash.content, 'hex')), decipher.final()]);

    return decrpyted.toString();
};

module.exports = {
    encrypt,
    decrypt
};

下面的示例演示如何使用上述功能来加密和解密文本数据(字符串,数字等):
crypto-text.js

const { encrypt, decrypt } = require('./crypto');

const hash = encrypt('Hello World!');

console.log(hash);

// {
//     iv: '237f306841bd23a418878792252ff6c8',
//     content: 'e2da5c6073dd978991d8c7cd'
// }

const text = decrypt(hash);

console.log(text); // Hello World!

加密和解密缓冲区

您也可以使用上面定义的功能对缓冲区进行加密和解密。 只需传递缓冲区代替字符串,它应该可以工作:
crypto-buffer.js

const { encrypt, decrypt } = require('./crypto');

const hash = encrypt(Buffer.from('Hello World!', 'utf8'));

console.log(hash);

// {
//     iv: '692e44dbbea073fc1a8d1c37ea68dffa',
//     content: 'bbffd902d55d7a00f3a0504e'
// }

const text = decrypt(hash);

console.log(text); // Hello World!

加密和解密流

您还可以使用加密模块对流进行加密和解密,如以下示例所示:
crypto-stream.js

const crypto = require('crypto');
const fs = require('fs');

const algorithm = 'aes-256-ctr';
const secretKey = 'vOVH6sdmpNWjRRIqCc7rdxs01lwHzfr3';
const iv = crypto.randomBytes(16);

// input file
const r = fs.createReadStream('file.txt');

// encrypt content
const encrypt = crypto.createCipheriv(algorithm, secretKey, iv);

// decrypt content
const decrypt = crypto.createDecipheriv(algorithm, secretKey, iv);

// write file
const w = fs.createWriteStream('file.out.txt');

// start pipe
r.pipe(encrypt)
    .pipe(decrypt)
    .pipe(w);

源代码:在MIT许可下可从GitHub下载此项目的完整源代码。

结论

在本文中,我们研究了如何使用Node.js内置的crypto模块对文本,缓冲区和流执行加密操作。 如果在将敏感数据(例如密钥)存储到数据库之前需要对其进行加密,这将非常有用。

喜欢这篇文章吗? 在TwitterLinkedIn上关注我。 您也可以订阅RSS Feed

您可能还喜欢

Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它让JavaScript代码能够在服务器端执行,非常适合构建网络应用。在Node.js部署加密解密程序,通常会用到一些流行的加密库,如`crypto`模块,它是Node.js的内置模块,提供了各种加密功能,包括散列、HMAC、加密解密、签名、验证等。 部署加密解密程序的基本步骤如下: 1. 创建Node.js项目并初始化npm。 2. 安装加密相关的npm包,比如`crypto`模块(Node.js内置无需安装)。 3. 使用`crypto`模块提供的API编写加密解密逻辑。 4. 在Node.js应用集成加密解密功能,确保它可以接收数据进行处理。 5. 测试加密解密程序确保其正确性和安全性。 6. 根据需要配置网络环境,将应用部署到服务器上。 这里是一个简单的使用`crypto`模块进行加密解密的例子: ```javascript const crypto = require('crypto'); // 创建一个加密函数 function encrypt(text, password) { const cipher = crypto.createCipher('aes-256-cbc', password); let encrypted = cipher.update(text); encrypted = Buffer.concat([encrypted, cipher.final()]); return encrypted.toString('hex'); } // 创建一个解密函数 function decrypt(text, password) { const decipher = crypto.createDecipher('aes-256-cbc', password); let decrypted = decipher.update(Buffer.from(text, 'hex')); decrypted = Buffer.concat([decrypted, decipher.final()]); return decrypted.toString(); } // 使用示例 const password = 'password'; // 应该是一个安全的随机密码 const text = 'Hello World'; const encrypted = encrypt(text, password); console.log(encrypted); // 输出加密后的十六进制字符串 const decrypted = decrypt(encrypted, password); console.log(decrypted); // 输出解密后的文本,应为 "Hello World" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值