crypto
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 版权协议,转载请附上原文出处链接和本声明。