导语:随着网络的飞速发展,网络安全问题也越来越重大。明天说一下在 node 中进行加密和解密的办法实现,次要是明码生成,明码加密传输,文本加密三种类型。
目录
- 名词解释
- 办法实现
- 实战演练
名词解释
上面就文中波及到的各个加密办法进行概念解释。
- AES,密码学中的高级加密规范(Advanced Encryption Standard,AES),又称 Rijndael 加密法,是美国联邦政府采纳的一种区块加密规范。
- MD5,信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被宽泛应用的明码散列函数,能够产生出一个 128 位(16 字节)的散列值(hash value),用于确保信息传输残缺统一。MD5 由美国明码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于 1992 年公开;
- Base64, 网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64 就是一种基于 64 个可打印字符来示意二进制数据的办法。
- SHA256,平安散列算法 SHA 系列算法之一,其摘要长度为 256bits,即 32 个字节,故称 SHA256。对于任意长度(按 bit 计算)的音讯,SHA256 都会产生一个 32 个字节长度数据,称作音讯摘要。当接管到音讯的时候,这个音讯摘要能够用来验证数据是否产生扭转,即验证其完整性。
感兴趣的能够看下以下几篇文章具体理解下内容:
- 《AES 加密算法的具体介绍与实现》
- 《MD5 算法详解》
- 《Base64 笔记》
- 《一文读懂 SHA256 算法原理及其实现》
办法实现
文本加解密
这里次要是应用 crypto-js
库进行实现的。依据这个库给出的办法,能够很轻松的对信息进行加密和解密,上面就间接写个办法吧。
目前比拟高级的加密算法是AES
,上面的就是应用的这个算法。
- 装置
npm install crypto-js
- 引入文件
const CryptoJS = require('crypto-js');
- 设置
iv
和key
const key = CryptoJS.enc.Utf8.parse('1c0c492f3c95b700');
const iv = CryptoJS.enc.Utf8.parse('1160837067ec4700');
- 文本加密
// 加密
function Encrypto(pwd) {let srcs = CryptoJS.enc.Utf8.parse(pwd);
let encrypto = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypto.ciphertext.toString().toUpperCase();
}
- 文本解密
// 解密
function Decrypto(pwd) {let encryptHexStr = CryptoJS.enc.Hex.parse(pwd);
let srcs = CryptoJS.enc.Base64.stringify(encryptHexStr);
let decrypto = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
let decryptoStr = decrypto.toString(CryptoJS.enc.Utf8);
return decryptoStr.toString();}
明码加密
有时候前端向后端传输用户信息,不能是明文传输,容易透露用户信息隐衷,所以就要加密传输,这里给出一种加盐算法, 我采取的是 sha256(Base64(md5(str)))
的形式。
- 装置依赖包
这个办法须要 crypto
,js-sha256
,js-base64
这几个依赖包。
npm install crypto js-sha256 js-base64
- 引入依赖包
const crypto = require('crypto');
const jsSha = require('js-sha256');
const {Base64} = require('js-base64');
- md5 加密
const md5Crypto = (pwd) => {let md5 = crypto.createHash('md5');
md5.update(pwd);
return md5.digest('hex');
}
- sha256 加密
const shaCrypto = (pwd) => {return jsSha.sha256(pwd);
}
- Base64 加密
const baseCrypto = (pwd) => {return Base64.Base64.encode(pwd);
}
- 加盐明码
function saltPassword(pwd) {return shaCrypto(baseCrypto(md5Crypto(pwd)));
}
生成随机明码
这个就没有依赖包了,手动实现下吧。
function Generator(min, max) {
// 能够生成随机明码的相干数组
let num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
let english = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
let ENGLISH = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
let special = ["-", "_", "#"];
let config = num.concat(english).concat(ENGLISH).concat(special);
// 先放入一个必须存在的
let arr = [];
arr.push(getOne(num));
arr.push(getOne(english));
arr.push(getOne(ENGLISH));
arr.push(getOne(special));
// 获取须要生成的长度
let len = min + Math.floor(Math.random() * (max - min + 1));
for (let i = 4; i < len; i++) {
// 从数组外面抽出一个
arr.push(config[Math.floor(Math.random() * config.length)]);
}
// 乱序
let newArr = [];
for (let j = 0; j < len; j++) {newArr.push(arr.splice(Math.random() * arr.length, 1)[0]);
}
// 随机从数组中抽出一个数值
function getOne(arr) {return arr[Math.floor(Math.random() * arr.length)];
}
return newArr.join("");
}
实战演练
通过前几篇文章,置信对 node,express 曾经有了理解,这里就省略那个接口的代码了。
上面看一下成果。
文本就 mark
,明码就123456
吧,简略测试下。
加解密预览
这个是对文本mark
AES 加密后的内容FB5A4BAF6E53963BAC2B1BA2EAF29DB1
这个是对文本FB5A4BAF6E53963BAC2B1BA2EAF29DB1
AES 解密后的内容mark
明码预览
- md5 预览
- sha256 预览
- Base64 预览
- 加盐预览
生成明码预览
- 加盐预览
好了,web 平安明码加解密,生成这块的内容就介绍到这里,当前还会持续补充的。