crypto實現加密node
本文轉自:http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501504929883d11d84a1541c6907eefd792c0da51000算法
crypto模塊的做用是爲了實現通用的加密和哈希算法。用純JavaScript實現加密也是能夠的,可是比較麻煩且速度很慢, 可是node就使用底層的C/C++實現了加密和哈希算法而後封裝起來暴露出接口,供js調用 。 crypto能夠實現MD5和SHA1等等等等,由於crypto是封裝了不少種加密算法的模塊。安全
MD5和SHA1函數
MD5是一種經常使用的哈希算法,用於給任意數據一個簽名,這個簽名用一個16進制字符串表示 。測試
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。ui
若是要計算SHA1來進行簽名,只須要將MD5改成SHA1便可。this
還有更安全的SHA256和SHA512。 (注意: SHA1最後是數字1,而不是字母L)。編碼
Hmac加密
Hmac也是一種哈希算法,不一樣的是,這種算法除了MD5和SHA1的類似之處外,還須要一個額外的密鑰。spa
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!
能夠看出加密後的字符通過解密由獲得了原來的內容。
注意到AES有不少不一樣的算法,如aes192
,aes-128-ecb
,aes-256-cbc
等,AES除了密鑰外還能夠指定IV(Initial Vector),不一樣的系統只要IV不一樣,用相同的密鑰加密相同的數據獲得的加密結果也是不一樣的。加密結果一般有兩種表示方法:hex和base64,這些功能Nodejs所有都支持,可是在應用中要注意,若是加解密雙方一方用Nodejs,另外一方用Java、PHP等其它語言,須要仔細測試。若是沒法正確解密,要確認雙方是否遵循一樣的AES算法,字符串密鑰和IV是否相同,加密後的數據是否統一爲hex或base64格式
。。。