學(xué)習(xí)網(wǎng)址:https://www.liaoxuefeng.com/
感謝站長(zhǎng)[廖雪峰]裹虫!
1.crypto模塊
目的是為了提供通用的加密和哈希算法筑公。Nodejs用C/C++實(shí)現(xiàn)這些算法后尊浪,通過(guò)cypto這個(gè)模塊暴露為JavaScript接口封救,運(yùn)行速度也快誉结。
2.MD5和SHA1(單向加密)
MD5是一種常用的哈希算法券躁,用于給任意數(shù)據(jù)一個(gè)“簽名”。
const crypto = require('crypto');
const hash = crypto.createHash('md5');
// 可任意多次調(diào)用update():
hash.update('Hello, world!');
hash.update('Hello, nodejs!');console.log(hash.digest('hex')); // 7e1977739c748beac0c0fd14fd26a544
update()方法默認(rèn)字符串編碼為UTF-8以舒,也可以傳入Buffer。
計(jì)算SHA1扼脐,只需要把'md5'改成'sha1',更安全的sha256艰赞、sha512肚吏。
3.Hmac(單向加密)
Hmac算法也是一種哈希算法,它可以利用MD5或SHA1等哈希算法党觅。不同的是斋泄,Hmac還需要一個(gè)密鑰:
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理解為用隨機(jī)數(shù)“增強(qiáng)”的哈希算法炫掐。只要密鑰發(fā)生了變化,那么同樣的輸入數(shù)據(jù)也會(huì)得到不同的簽名旗唁。
4.AES(雙向加解密)
AES是一種常用的對(duì)稱加密算法痹束,加解密都用同一個(gè)密鑰。
crypto模塊提供了AES支持电谣,但是需要自己封裝好函數(shù),便于使用:
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);
運(yùn)行結(jié)果如下:
Plain text: Hello, this is a secret message!
Encrypted text: 8a944d97bdabc157a5b7a40cb180e7...
Decrypted text: Hello, this is a secret message!
注意(比較復(fù)雜):
注意到AES有很多不同的算法企垦,如aes192钞诡,aes-128-ecb湃崩,aes-256-cbc等,AES除了密鑰外還可以指定IV(Initial Vector)朵诫,不同的系統(tǒng)只要IV不同薄扁,用相同的密鑰加密相同的數(shù)據(jù)得到的加密結(jié)果也是不同的。
加密結(jié)果通常有兩種表示方法:hex和base64脱盲,這些功能Nodejs全部都支持日缨。
但是在應(yīng)用中要注意,如果加解密雙方一方用Nodejs面哥,另一方用Java毅待、PHP等其它語(yǔ)言,需要仔細(xì)測(cè)試恩静。
如果無(wú)法正確解密,要確認(rèn)雙方是否遵循同樣的AES算法邑飒,字符串密鑰和IV是否相同级乐,加密后的數(shù)據(jù)是否統(tǒng)一為hex或base64格式。
5.Diffie-Hellman(握手協(xié)議加密风科,高級(jí)用法)
DH算法是一種密鑰交換協(xié)議,它可以讓雙方在不泄漏密鑰的情況下協(xié)商出一個(gè)密鑰來(lái)题山。DH算法基于數(shù)學(xué)原理。
具體參照:
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501504929883d11d84a1541c6907eefd792c0da51000
6.證書(牛叉玖姑,但不建議)
crypto模塊也可以處理數(shù)字證書。
數(shù)字證書通常用在SSL連接焰络,也就是Web的https連接闪彼。
一般情況下协饲,https連接只需要處理服務(wù)器端的單向認(rèn)證,如無(wú)特殊需求(例如自己作為Root給客戶發(fā)認(rèn)證證書)郊尝,建議用反向代理服務(wù)器如Nginx等Web服務(wù)器去處理證書二跋。