nodejs的加密模塊crypto是使用了系統(tǒng)自帶的openssl的加密模塊來實(shí)現(xiàn)的乙埃,里面實(shí)現(xiàn)了多種加密算法,如md5朗徊、sh1快骗、aes等等,即常用的hash算法娜庇,Hmac算法,加解密算法等
hash算法的使用方篮,用md5加密來舉例名秀,其他的類似
const crypto = require('crypto');
/**
* md5加密
* @param str 需要加密的字符串
* @returns {*}
*/
function encryptMd5(str) {
const md5 = crypto.createHash('md5');
return md5.update(str).digest('hex').toLowerCase();
}
const test1 = encryptMd5(‘1231asdda’);
console.log(test1);
只用crypto.createHash('md5')創(chuàng)建一個md5加密的hash,因?yàn)閯?chuàng)建的md5加密只能對每個加密字符串使用一次藕溅,所以需要每次加密的時候都創(chuàng)建一個新的md5加密塊
update告訴md5加密需要對哪個字符串進(jìn)行加密匕得,可以多次調(diào)用,多次調(diào)用的結(jié)果類似于使用md5.update(str1+str2);也就是說
md5.update(str1);
md5.update(str2);
和
md5.update(str1+str2);
加密出來的效果是一樣的
調(diào)用digest()對update傳入的字符串或者二進(jìn)制數(shù)據(jù)進(jìn)行加密,可以傳入加密后顯示的格式作為參數(shù)巾表,可接受的參數(shù):hex(16進(jìn)制)汁掠、base64(base64格式)等,一般選用的是hex格式集币,一旦調(diào)用了digest之后考阱,這個md5加密串就完成使命了,再次調(diào)用md5.update或者digest都會提示錯誤鞠苟,這個時候要想對其他數(shù)據(jù)進(jìn)行加密的話乞榨,需要創(chuàng)建一個新的加密字串算法
AES等加解密算法
這類算法允許我們對一個字符串或者二進(jìn)制數(shù)據(jù)進(jìn)行加密,然后在解密出來使用当娱,以AES算法來舉例
// 加密
function encrypt(str, key) {
const cipherChunks = [];
const ciper = crypto.createCipheriv('aes-128-ecb', key, '');
cipherChunks.push(ciper.update(str, 'utf-8', 'hex'));
cipherChunks.push(ciper.final('hex'));
return cipherChunks.join('');
}
// 解密
function decipher(str, key){
const cipherChunks = [];
const decipher = crypto.createDecipheriv('aes-128-ecb', key, '');
cipherChunks.push(decipher.update(str, 'hex', 'utf-8'));
cipherChunks.push(decipher.final('hex'));
return cipherChunks.join('');
}
類似于hash算法的使用吃既,nodejs提供了兩種創(chuàng)建AES算法的方式,一種需要使用加密向量createDecipheriv趾访,一種是不需要使用加密向量的createDecipher态秧,一般我們要使自己的加密出來的結(jié)果和java等其他語言加密的結(jié)果相等的話,就需要使用第一種方式扼鞋,傳遞一個空字符串作為向量,注意這里的key的長度需要為16位字符長度申鱼,也就是128的字節(jié)長度,因?yàn)槲覀兪褂玫氖莂es-128-ecb的加解密算法云头,也就是key需要為128字節(jié)長度即16個字符串的長度