2018-06-28 学习NodeJs 加密模块 crypto
学习网址:https://www.liaoxuefeng.com/
感谢站长[廖雪峰]!
1.crypto模块
目的是为了提供通用的加密和哈希算法。Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaScript接口,运行速度也快。
2.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',更安全的sha256、sha512。
3.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理解为用随机数“增强”的哈希算法。只要密钥发生了变化,那么同样的输入数据也会得到不同的签名。
4.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!
注意(比较复杂):
注意到AES有很多不同的算法,如aes192,aes-128-ecb,aes-256-cbc等,AES除了密钥外还可以指定IV(Initial Vector),不同的系统只要IV不同,用相同的密钥加密相同的数据得到的加密结果也是不同的。
加密结果通常有两种表示方法:hex和base64,这些功能Nodejs全部都支持。
但是在应用中要注意,如果加解密双方一方用Nodejs,另一方用Java、PHP等其它语言,需要仔细测试。
如果无法正确解密,要确认双方是否遵循同样的AES算法,字符串密钥和IV是否相同,加密后的数据是否统一为hex或base64格式。
5.Diffie-Hellman(握手协议加密,高级用法)
DH算法是一种密钥交换协议,它可以让双方在不泄漏密钥的情况下协商出一个密钥来。DH算法基于数学原理。
具体参照:
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501504929883d11d84a1541c6907eefd792c0da51000
6.证书(牛叉,但不建议)
crypto模块也可以处理数字证书。
数字证书通常用在SSL连接,也就是Web的https连接。
一般情况下,https连接只需要处理服务器端的单向认证,如无特殊需求(例如自己作为Root给客户发认证证书),建议用反向代理服务器如Nginx等Web服务器去处理证书。