nodejs的加密模块crypto是使用了系统自带的openssl的加密模块来实现的,里面实现了多种加密算法,如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')创建一个md5加密的hash,因为创建的md5加密只能对每个加密字符串使用一次,所以需要每次加密的时候都创建一个新的md5加密块
update告诉md5加密需要对哪个字符串进行加密,可以多次调用,多次调用的结果类似于使用md5.update(str1+str2);也就是说
md5.update(str1);
md5.update(str2);
和
md5.update(str1+str2);
加密出来的效果是一样的
调用digest()对update传入的字符串或者二进制数据进行加密,可以传入加密后显示的格式作为参数,可接受的参数:hex(16进制)、base64(base64格式)等,一般选用的是hex格式,一旦调用了digest之后,这个md5加密串就完成使命了,再次调用md5.update或者digest都会提示错误,这个时候要想对其他数据进行加密的话,需要创建一个新的加密字串算法
AES等加解密算法
这类算法允许我们对一个字符串或者二进制数据进行加密,然后在解密出来使用,以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提供了两种创建AES算法的方式,一种需要使用加密向量createDecipheriv,一种是不需要使用加密向量的createDecipher,一般我们要使自己的加密出来的结果和java等其他语言加密的结果相等的话,就需要使用第一种方式,传递一个空字符串作为向量,注意这里的key的长度需要为16位字符长度,也就是128的字节长度,因为我们使用的是aes-128-ecb的加解密算法,也就是key需要为128字节长度即16个字符串的长度
nodejs常用加密方式
/**
* @加密模块
* @md5可以被彩虹吧破解,这里就不用啦
* @author lwt
* */
//导入模块
var crypto = require('crypto');
/**
* @aes192加密模块
* @param str string 要加密的字符串
* @param secret string 要使用的加密密钥(要记住,不然就解不了密啦)
* @retrun string 加密后的字符串
* */
exports.getEncAse192 = function(str, secret) {
var cipher = crypto.createCipher("aes192", secret); //设置加密类型 和 要使用的加密密钥
var enc = cipher.update(str, "utf8", "hex"); //编码方式从utf-8转为hex;
enc += cipher.final("hex"); //编码方式从转为hex;
return enc; //返回加密后的字符串
}
/**
* @aes192解密模块
* @param str string 要解密的字符串
* @param secret string 要使用的解密密钥(要和密码的加密密钥对应,不然就解不了密啦)
* @retrun string 解密后的字符串
* */
exports.getDecAse192 = function(str, secret) {
var decipher = crypto.createDecipher("aes192", secret);
var dec = decipher.update(str, "hex", "utf8");//编码方式从hex转为utf-8;
dec += decipher.final("utf8");//编码方式从utf-8;
return dec;
}
/**
* @Hmac-sha1加密模块 (每次加密随机,不可逆)
* @param str string 要加密的字符串
* @param secret string 要使用的加密密钥
* @retrun string 加密后的字符串
* */
exports.getHmac = function(str, secret) {
var buf = crypto.randomBytes(16);
secret = buf.toString("hex");//密钥加密;
var Signture = crypto.createHmac("sha1", secret);//定义加密方式
Signture.update(str);
var miwen=Signture.digest().toString("base64");//生成的密文后将再次作为明文再通过pbkdf2算法迭代加密;
return miwen;
}
/**
* @sha1加密模块 (加密固定,不可逆)
* @param str string 要加密的字符串
* @retrun string 加密后的字符串
* */
exports.getSha1 = function(str) {
var sha1 = crypto.createHash("sha1");//定义加密方式:md5不可逆,此处的md5可以换成任意hash加密的方法名称;
sha1.update(str);
var res = sha1.digest("hex"); //加密后的值d
return res;
}
源地址