nodejs --- crypto實現加密(轉)

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有不少不一樣的算法,如aes192aes-128-ecbaes-256-cbc等,AES除了密鑰外還能夠指定IV(Initial Vector),不一樣的系統只要IV不一樣,用相同的密鑰加密相同的數據獲得的加密結果也是不一樣的。加密結果一般有兩種表示方法:hex和base64,這些功能Nodejs所有都支持,可是在應用中要注意,若是加解密雙方一方用Nodejs,另外一方用Java、PHP等其它語言,須要仔細測試。若是沒法正確解密,要確認雙方是否遵循一樣的AES算法,字符串密鑰和IV是否相同,加密後的數據是否統一爲hex或base64格式

 

  

  Diffie-Hellman

  。。。

相關文章
相關標籤/搜索