crypto模塊的目的是為了提供通用的加密和哈希算法顶伞。用純JavaScript代碼實(shí)現(xiàn)這些功能不是不可能憾儒,但速度會(huì)非常慢碰声。Nodejs用C/C++實(shí)現(xiàn)這些算法后耍共,通過(guò)cypto這個(gè)模塊暴露為JavaScript接口烫饼,這樣用起來(lái)方便,運(yùn)行速度也快试读。
crypto
閱讀: 24241
crypto模塊的目的是為了提供通用的加密和哈希算法杠纵。用純JavaScript代碼實(shí)現(xiàn)這些功能不是不可能,但速度會(huì)非常慢钩骇。Nodejs用C/C++實(shí)現(xiàn)這些算法后比藻,通過(guò)cypto這個(gè)模塊暴露為JavaScript接口,這樣用起來(lái)方便倘屹,運(yùn)行速度也快银亲。
MD5和SHA1
MD5是一種常用的哈希算法,用于給任意數(shù)據(jù)一個(gè)“簽名”纽匙。這個(gè)簽名通常用一個(gè)十六進(jìn)制的字符串表示:
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',就可以得到SHA1的結(jié)果1f32b9c9932c02227819a4151feed43e131aca40赠尾。
還可以使用更安全的sha256和sha512力穗。
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...
只要密鑰發(fā)生了變化,那么同樣的輸入數(shù)據(jù)也會(huì)得到不同的簽名寸宵,因此崖面,可以把Hmac理解為用隨機(jī)數(shù)“增強(qiáng)”的哈希算法。
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!
可以看出简识,加密后的字符串通過(guò)解密又得到了原始內(nèi)容。