📜  Node.js 中的加密模块是什么以及它是如何使用的?(1)

📅  最后修改于: 2023-12-03 15:03:15.102000             🧑  作者: Mango

Node.js 中的加密模块是什么以及它是如何使用的?

在 Node.js 中,有一个官方的加密模块 crypto 可以用来进行常用的加密操作,例如哈希、对称加密、非对称加密等。

哈希

哈希是一种将任意长度的消息压缩为固定长度摘要的方法。Node.js 提供了多种哈希函数,例如 MD5、SHA256 等。下面是一个使用 SHA256 哈希函数计算摘要的例子:

const crypto = require('crypto');
const message = 'hello world';
const hash = crypto.createHash('sha256').update(message).digest('hex');
console.log(hash); // 输出:d2ddea18f00665ce8620d1ab2a84c0c23c68a1d9f84c4f11de1e2bfdcf728185
常用哈希函数

| 算法 | 返回长度 | | --- | --- | | md5 | 128 bits | | sha1 | 160 bits | | sha256 | 256 bits | | sha512 | 512 bits |

对称加密

对称加密是指使用相同的密钥进行加密和解密的方法。Node.js 中提供了多种对称加密算法,例如 AES、DES、3DES 等。下面是一个使用 AES 对称加密算法加密解密数据的例子:

const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt(message) {
  const cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(message, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return encrypted;
}

function decrypt(message) {
  const decipher = crypto.createDecipheriv(algorithm, key, iv);
  let decrypted = decipher.update(message, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

const message = 'hello world';
const encryptedMessage = encrypt(message);
console.log(encryptedMessage);
const decryptedMessage = decrypt(encryptedMessage);
console.log(decryptedMessage); // 输出:hello world
非对称加密

非对称加密是指使用一对密钥进行加密和解密的方法,这对密钥通常称为公钥和私钥。Node.js 中提供了多种非对称加密算法,例如 RSA、DSA 等。下面是一个使用 RSA 非对称加密算法加密解密数据的例子:

const crypto = require('crypto');
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
    modulusLength: 2048,
});

function encrypt(message) {
    const buffer = Buffer.from(message);
    const encrypted = crypto.publicEncrypt(publicKey, buffer);
    return encrypted.toString('base64');
}

function decrypt(encryptedMessage) {
    const buffer = Buffer.from(encryptedMessage, 'base64');
    const decrypted = crypto.privateDecrypt(privateKey, buffer);
    return decrypted.toString('utf8');
}

const message = 'hello world';
const encryptedMessage = encrypt(message);
console.log(encryptedMessage);
const decryptedMessage = decrypt(encryptedMessage);
console.log(decryptedMessage); // 输出:hello world

以上是 crypto 模块的一些常用用法,更多详细的说明可以查看 Node.js 官方文档。