2018-06-28 学习NodeJs 加密模块 crypto

2018-06-28  本文已影响23人  石头Oday

学习网址: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服务器去处理证书。

上一篇 下一篇

猜你喜欢

热点阅读