使用 crypto 模块进行加密和解密

  • Post author:
  • Post category:其他



crypto

模块的主要功能有

哈希算法、对称加密以及非对称加密



1 哈希算法 hash

hash 通常给数据签名,它是

一种不可逆的加密算法



常用的 hash 算法有 md5、sha1、sha256、sha512等等。


MD5

是这一种常用的哈希算法,具有长度固定(输出总是16个字节)。

// 引入 crypto
const crypto = require('crypto');

// 使用 crypto.createHash 创建哈希算法,传入一个参数为算法类型,如 mad5、sha1、sha256等
const hash = crypto.createHash('md5');

// 可任意多次调用 update() 进行计算
hash.update('swim');
hash.update('swimming');

// 转换完的结果 
// 'hex' 按照 16进制的数字存储
console.log(hash.digest('hex')); // b41dd3655615d7d830e1884ed477e7a5

// 'base64 按照 base64 的格式来展示
// console.log(hash.digest('base64')); // tB3TZVYV19gw4YhO1HfnpQ==


Hmac

算法也是一种哈希算法,它可以利用 MD5 或 SHA1 等哈希算法。

不同的是,

Hmac 还需要一个秘钥

:只要密钥发生了变化,那么同样的输入数据也会得到不同的签名,因此 Hmac 算法是一种增强的哈希算法。

// 引入 crypto
const crypto = require('crypto');

// 使用 crypto.createHmac 创建哈希算法,传入两个参数。
const hmac = crypto.createHmac('sha1', 'secret_key'); //两个参数:算法的类型、秘钥
hmac.update('swim');
console.log(hmac.digest('hex')); // 7720c56314a9ebee8d3aed17cacd77d0646d4011

//只要密钥发生了变化,那么同样的输入数据也会得到不同的签名
const hmac = crypto.createHmac('sha1', 'secret_key2');
hmac.update('swim');
console.log(hmac.digest('hex')); // cb3c58e324da23284065f2d91c49c68967db538b



2 对称加密 AES


AES

是一种常用的

对称加密算法

,加密解密都用同一个秘钥。

crypto 模块提供了 AES 支持,但需要自己封装好函数,方便使用:

// 引入 crypto
const crypto = require("crypto");

// 1 定义加密方法
function aesEncrypt(key, iv, data) {
  // 三个参数:加密的key、加密的iv、需要加密的数据

  // 创建加密对象:三个参数(加密的算法,加密的key,加密的iv)
  const cipher = crypto.createCipheriv("aes-128-cbc", key, iv);

  // 开始加密:三个参数(要加密的数据、加密前的数据类型以及加密后的数据格式)
  let crypted = cipher.update(data, "binary", "hex");

  // 加密结束:结尾加上 cipher.final('hex') 表示结束
  crypted += cipher.final("hex");

  // 返回密文
  return crypted;
}

// 2 定义解密方法
function aesDecrypt(key, iv, crypted) {
  // 转换解密数据:把需要解密的数据,转化成 buffer 格式,再转换成二进制
  crypted = Buffer.from(crypted, "hex").toString("binary");

  // 创建解密对象
  const decipher = crypto.createDecipheriv("aes-128-cbc", key, iv);

  // 开始解密:三个参数(要解密的数据、解密前的数据类型以及解密后的数据格式)
  let decrypted = decipher.update(crypted, "binary", "utf8");
  // 解密结束
  decrypted += decipher.final("utf8");

  // 返回明文
  return decrypted;
}

// 3 定义 key 和 iv
const key = "abcdef0123456789";
const iv = "0123456789abcdef";
// 注意:加密算法选128时,就需要16个字节128位的kye和iv, 16*8 = 128 1个字节占8位

// 4 加密
const data = "hello world";
const crypted = aesEncrypt(key, iv, data); // 加密
console.log("加密结果:", crypted); // 808da3d74f3bed91b38e3ca27d1a47a1

// 5 解密
const decrypted = aesDecrypt(key, iv, crypted); // 解密
console.log("解密结果:", decrypted); // hello world

// 注意:加密和解密时,使用的 key 和 iv 必须同一个



版权声明:本文为qq_53931766原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。