📜  Node.js加密(1)

📅  最后修改于: 2023-12-03 14:44:43.500000             🧑  作者: Mango

Node.js加密

简介

Node.js的加密模块提供了常见的加密算法,包括对称加密和非对称加密等算法。对称加密适用于加密数据块较小的场景,而非对称加密则适用于需要保证数据安全、签名验证等场景。

对称加密

对称加密使用同一把密钥进行加密和解密,密钥因此需要被安全地传输。Node.js的内置模块提供了多种对称加密算法,包括AES、DES、3DES等。

加密

Node.js中使用对称加密需要借助crypto模块。以下是对字符串进行AES加密的示例代码:

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

function encrypt(text) {
  const cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(text, 'utf-8', 'hex');
  encrypted += cipher.final('hex');
  return {
    iv: iv.toString('hex'),
    content: encrypted
  };
}

这段代码中我们使用了AES-256-CBC算法,指定密钥为mysecretkey。并生成了一个随机的初始向量(iv)。使用crypto.createCipheriv方法创建了一个加密实例,并将需要加密的文本(UTF-8编码格式)传入实例的update方法,最后调用final方法生成加密后的结果。

解密

要解密已加密数据,我们用createDecipheriv方法替代createCipheriv方法即可。以下是示例代码:

function decrypt(iv, content) {
  const decipher = crypto.createDecipheriv(algorithm, key, Buffer.from(iv, 'hex'));
  let decrypted = decipher.update(content, 'hex', 'utf-8');
  decrypted += decipher.final('utf-8');
  return decrypted;
}

这段代码接收加密数据以及初始化向量iv,通过Buffer.from方法将iv转化为Buffer类型,使用crypto.createDecipheriv方法生成解密实例,并将第二个参数设置为加密时使用的密钥。最后将加密内容(HEX格式)传入实例的update方法,最终调用final方法生成解密后的结果。

非对称加密

非对称加密使用不同的密钥进行加密和解密,通常称之为公钥和私钥。公钥用于加密数据,私钥用于解密数据或签名验证。非对称加密算法有RSA、DSA、EC等。

生成密钥

Node.js提供了crypto模块中的generateKeyPairSync方法用于生成公私钥对。以下是RSA算法生成密钥的示例代码:

const { generateKeyPairSync } = require('crypto');
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
  modulusLength: 4096, // 密钥位数
  publicKeyEncoding: {
    type: 'pkcs1', // 设置公钥格式
    format: 'pem',
  },
  privateKeyEncoding: {
    type: 'pkcs1', // 设置私钥格式
    format: 'pem',
  },
});
console.log(privateKey, publicKey);

这段代码中,我们使用了rsa算法生成了一个4096位的密钥。在生成密钥的过程中,我们设定了公私钥的编码格式为pkcs1,这是RSA算法中的一种标准格式。最后输出的是经过pem格式编码的私钥和公钥。

加密和解密

非对称加密算法中,公钥加密、私钥解密是最为常用的模式。以下是字符串进行RSA加密的示例代码:

function rsaEncrypt(data, publicKey) {
  const bufferData = Buffer.from(data, 'utf-8');
  const encrypted = crypto.publicEncrypt(publicKey, bufferData);
  return encrypted.toString('base64');
}

这段代码中,我们将需要加密的字符串转化为Buffer类型之后,使用crypto.publicEncrypt方法对其进行加密,并将加密结果作为Base64格式的字符串返回。加密时使用的公钥需要保证正确且无误。

以下是RSA解密的示例代码:

function rsaDecrypt(encryptedData, privateKey) {
  const bufferEncryptedData = Buffer.from(encryptedData, 'base64')
  const decrypted = crypto.privateDecrypt(privateKey, bufferEncryptedData);
  return decrypted.toString('utf-8');
}

这段代码中,我们先对加密后的结果(以Base64格式编码)做了Base64解码,然后使用私钥进行解密,并将解密结果转换为UTF-8编码的字符串。

总结

Node.js内置加密模块提供了非常丰富的加密算法,对于程序员来说使用起来非常方便。需要注意的是,在加密过程中密钥的安全性以及加密结果的可靠性都需要我们进行严格的考虑和测试。