node之crypto模块

程招
2023-12-01

crypto作用

crypto模块的目的是为了提供通用的加密和哈希算法

MD5和SHA1

MD5是一种常用的哈希算法,用于给任意数据一个“签名”。这个签名通常用一个十六进制的字符串表示:

const crypto = require('crypto');
const hash = crypto.createHash('md5');
// 可任意多次调用update():
hash.update('Hello, world!');
hash.update('Hello, nodejs!');
console.log(hash.digest('hex')); // 7e1977739c748beac0c0fd14fd26a544

update()方法默认字符串编码为UTF-8,也可以传入Buffer。

如果要计算SHA1,只需要把'md5'改成'sha1',就可以得到SHA1的结果1f32b9c9932c02227819a4151feed43e131aca40

如:

  params.sign = crypto.createHash('sha1').update(`${params.name}${params.email}${params.responseTime}${KEY}`, 'utf-8').digest('hex')

还可以使用更安全的sha256sha512

Hmac

Hmac算法也是一种哈希算法,它可以利用MD5或SHA1等哈希算法。不同的是,Hmac还需要一个密钥:

const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'secret-key');
hmac.update('Hello, world!');
hmac.update('Hello, nodejs!');
console.log(hmac.digest('hex')); // 80f7e22570..

只要密钥发生了变化,那么同样的输入数据也会得到不同的签名,因此,可以把Hmac理解为用随机数“增强”的哈希算法。

AES

AES是一种常用的对称加密算法,加解密都用同一个密钥。crypto模块提供了AES支持,但是需要自己封装好函数,便于使用:

const crypto = require('crypto');

function aesEncrypt(data, key) {
    const cipher = crypto.createCipher('aes192', key);
    var crypted = cipher.update(data, 'utf8', 'hex');
    crypted += cipher.final('hex');
    return crypted;
}

function aesDecrypt(encrypted, key) {
    const decipher = crypto.createDecipher('aes192', key);
    var decrypted = decipher.update(encrypted, 'hex', 'utf8');
    decrypted += decipher.final('utf8');
    return decrypted;
}

var data = 'Hello, this is a secret message!';
var key = 'Password!';
var encrypted = aesEncrypt(data, key);
var decrypted = aesDecrypt(encrypted, key);

console.log('Plain text: ' + data);
console.log('Encrypted text: ' + encrypted);
console.log('Decrypted text: ' + decrypted);

输出如下:

Plain text: Hello, this is a secret message!
Encrypted text: 8a944d97bdabc157a5b7a40cb180e7...
Decrypted text: Hello, this is a secret message!

crypto.js

node crypto模块相关功能的封装,接口较友好,用法如:

//MD5加密
var md5Encrypt = CryptoJS.MD5("Message");
//SHA1加密
var sha1Encrypt = CryptoJS.SHA1("Message");
//SHA256加密
var sha256Encrypt = CryptoJS.SHA256("Message"); 
//AES加解密
var aesEncrypt = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
var aesDecrypt = CryptoJS.AES.decrypt(aesEncrypt, "Secret Passphrase");
//3DES加解密(不建议使用DES,这里展示3DES)
var 3desEncrypt = CryptoJS.TripleDES.encrypt("Message", "Secret Passphrase");
var 3desDecrypt = CryptoJS.TripleDES.decrypt(3desEncrypt, "Secret Passphrase");
 类似资料: