「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
1.安装crypto-js库
使用npm安装crypto-js命令(我此时安装的版本为"crypto-js4.1.1")
npm install crypto-js
2.字符串md5加密示例
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的单向哈希算法不可逆,可以产生出一个128位(16字节的散列值(hash value),主要用于确保下载文件的信息传输完整一致,如一般的系统镜像文件,也可用于用户密码的加密(md5加密算法现被证明不安全,建议加盐使用,或使用其它加密方式)。
下面为使用md5来加密字符串123456。
let a1 = require("crypto-js");
let a2 = require("crypto");
//字符串md5加密
let res1 = a1.MD5("123456").toString();
let res2 = a2.createHash("md5").update('123456').digest('hex');
//使用res1或res2都可以,加密结果一样
console.log(res1);
console.log(res2);
3.字符串SHA256加密
SHA256是安全散列算法(Secure Hash Algorithm),对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,长度为32个字节,通常用一个长度为64的十六进制字符串来表示。
下面为使用SHA256来加密字符串123456。
let a1 = require("crypto-js");
let a2 = require("crypto");
let res3 = a1.SHA256("123456").toString();
let res4 = a2.createHash("sha256").update("123456").digest('hex');
//使用res3或res4都可以,加密结果一样
console.log(res3);
console.log(res4);
4.字符串HMac加密
HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,它可以与任何迭代散列函数捆绑使用。在HMAC的定义中用到一个密码散列函数H和一个密钥KHMAC运算,加密过程:利用hash算法,以一个消息M和一个密钥K作为输入,生成一个定长的消息摘要作为输出。
下面为使用HMac来加密字符串123456,密钥为apple,哈希算法为md5。
let a1 = require("crypto-js");
let a2 = require("crypto");
let res5 = a1.HmacMD5("123456", "apple").toString();
let res6 = a2.createHmac("md5","apple").update("123456").digest('hex');
//使用res5或res6都可以,加密结果一样
console.log(res5);
console.log(res6);
5.字符串AES加解密
AES为高级加密标准(Advanced Encryption Standard,AES),是一种对称加密算法,根据加密算法不同,密钥的长度和IV的长度不同,aes-128-cbc,那么cipher文件中的key和iv必须为16字节,aes-192-cbc key和iv必须为24字节,aes-256-cbc key和iv必须为32字节。
下面为使用aes-128-cbc加密和解密字符串123456,密钥为:nnnnnnnnnnnnnnnn,代码如下:
let a2 = require("crypto");
//aes128加密
function aes128encrypt(data, key){
let t1 = a2.createCipheriv('aes-128-cbc',key, "nnnnnnnnnnnnnnnn");
let crypted = t1.update(data,'utf-8','hex');
crypted += t1.final('hex');
return crypted;
}
//aes128解密
function unaes256encrypt(crypted,key){
let t2 = a2.createDecipheriv('aes-128-cbc', key, "nnnnnnnnnnnnnnnn");
let decrypted = t2.update(crypted, 'hex', 'utf8');
decrypted += t2.final('utf8');
return decrypted;
}
输出结果为123456
console.log(unaes256encrypt(aes256encrypt("123456","nnnnnnnnnnnnnnnn"),"nnnnnnnnnnnnnnnn"));
6.文件的md5值
第一种方法是使用文件流的方式读取文件,主要针对与大文件的md5值,第二种方法是使用一次性读取文件到内存中,主要针对与小文件的md5值。两种方法我都用的README.md文件,得出md5值一致。
let a2 = require("crypto");
let fs = require("fs");
//第一种方法,针对大文件
let dataStream = fs.createReadStream("README.md");
const hashValue = a2.createHash('md5');
dataStream.on('data', dd => {
hashValue.update(dd, 'utf8');
});
dataStream.on('end', () => {
const md5 = hashValue.digest('hex');
console.log(md5);
});
//第二种方法,针对小文件
let text = fs.readFile('README.md', 'utf8' , (err, data) => {
if (err) {
console.error(err)
return
}
console.log(a2.createHash('md5').update(data,'utf8').digest('hex'));
})
为了验证md5值正确,可使用win10自带的求hash值工具,打开powershell,进入当前文件目录,输入命令,命令如下:
Get-FileHash README.md -Algorithm MD5| Format-List