导语:随着网络的飞速发展,网络安全问题也越来越重大。明天说一下在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平安明码加解密,生成这块的内容就介绍到这里,当前还会持续补充的。