Node.js的crypto (加密)模塊

crypto (加密)模塊

crypto 模塊提供了加密功能,包含對 OpenSSL 的哈希、HMAC、加密、解密、簽名、以及驗證功能的一整套封裝。javascript

能夠經過 require('crypto') 來訪問該模塊。java

MD5和SHA1

MD5是一種經常使用的哈希算法,用於給任意數據一個「簽名」。這個簽名一般用一個十六進制的字符串表示:node

const crypto = require('crypto');
const md5hash = crypto.createHash('md5')
                .update('Hello, world!')
                .update('Hello, nodejs!')
                .digest('hex');
console.log(md5hash); //7e1977739c748beac0c0fd14fd26a544
複製代碼

可任意屢次調用update(): update()方法默認字符串編碼爲UTF-8,也能夠傳入Buffer。 若是要計算SHA1,只須要把'md5'改爲'sha1'。 還可使用更安全的sha256和sha512,即下面要說的Hmac。算法

Hmac

Hmac算法也是一種哈希算法,它能夠利用MD5或SHA1等哈希算法。不一樣的是,Hmac還須要一個密鑰:安全

const crypto = require('crypto');
const secret = 'abcdefg';
const shahash = crypto.createHmac('sha256', secret)
                   .update('I love cupcakes')
                   .update('I love cupcakes 2')
                   .digest('hex');
console.log(shahash);   //a7a10c0eaaac7ce8f570a29dd5201548a440005efa69684f565c4f7c520f17d9
複製代碼

只要密鑰發生了變化,那麼一樣的輸入數據也會獲得不一樣的簽名,所以,能夠把Hmac理解爲用隨機數「加強」的哈希算法。函數

AES

AES也是一種經常使用的對稱加密算法,加解密都用同一個密鑰。crypto模塊提供了AES支持,可是須要本身封裝好函數,便於使用:測試

const crypto = require('crypto');

function aesEncrypt(data, key) {
    const cipher = crypto.createCipher('aes192', key);
    let crypted = cipher.update(data, 'utf8', 'hex');
    crypted += cipher.final('hex');
    return crypted;
}

function aesDecrypt(encrypted, key) {
    const decipher = crypto.createDecipher('aes192', key);
    let decrypted = decipher.update(encrypted, 'hex', 'utf8');
    decrypted += decipher.final('utf8');
    return decrypted;
}

let data = '個人密碼';
let key = 'Password!';
let encrypted = aesEncrypt(data, key);
let decrypted = aesDecrypt(encrypted, key);

console.log('text: ' + data);
console.log('Encrypted text: ' + encrypted);
console.log('Decrypted text: ' + decrypted);
// Plain text: 個人密碼
// Encrypted text: 3cdfa3aafa581ce77eb816d2ea6f901f
// Decrypted text: 個人密碼
複製代碼

能夠看出,這種加密方式是可逆的,即加密後的字符串經過解密又獲得了原始內容。 AES有不少不一樣的算法,如aes192,aes-128-ecb,aes-256-cbc等,AES除了密鑰外還能夠指定IV(Initial Vector),不一樣的系統只要IV不一樣,用相同的密鑰加密相同的數據獲得的加密結果也是不一樣的。ui

加密結果一般有兩種表示方法:hex和base64,這些功能Nodejs所有都支持,可是在應用中要注意,若是加解密雙方一方用Nodejs,另外一方用Java、PHP等其它語言,須要仔細測試。編碼

若是沒法正確解密,要確認雙方是否遵循一樣的AES算法,字符串密鑰和IV是否相同,加密後的數據是否統一爲hex或base64格式。加密

Diffie-Hellman

DH算法是一種密鑰交換協議,它可讓雙方在不泄漏密鑰的狀況下協商出一個密鑰來。DH算法基於數學原理,好比A和B想要協商一個密鑰,能夠這麼作:

使用場景:

A先選一個素數和一個底數:素數p=23,底數g=5(底數能夠任選),再選擇一個祕密整數a=6,計算A=g^a mod p=8,而後告訴B:p=23,g=5,A=8;

B收到A發來的p,g,A後,也選一個祕密整數b=15,而後計算B=g^b mod p=19,並告訴A:B=19;

A本身計算出s=B^a mod p=2,B也本身計算出s=A^b mod p=2,所以,最終協商的密鑰s爲2。 很麻煩的樣子,仍是上代碼吧:

const crypto = require('crypto');
// A 的 keys:
let A = crypto.createDiffieHellman(512);        
let A_keys = A.generateKeys();                 

let prime = A.getPrime();
let generator = A.getGenerator();

console.log('Prime: ' + prime.toString('hex'));
console.log('Generator: ' + generator.toString('hex'));

// B 的 keys:
let B = crypto.createDiffieHellman(prime, generator);
let B_keys = B.generateKeys();

// exchange and generate secret:
let A_secret = A.computeSecret(B_keys);
let B_secret = B.computeSecret(A_keys);

// print secret:
console.log('Secret of A: ' + A_secret.toString('hex'));
console.log('Secret of B: ' + B_secret.toString('hex'));
複製代碼

That's all, 如上;

相關文章
相關標籤/搜索