导语:随着网络的飞速发展,网络安全问题也越来越重大。明天说一下在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');
  • 设置ivkey
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)))的形式。

  • 装置依赖包

这个办法须要cryptojs-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吧,简略测试下。

加解密预览

这个是对文本markAES加密后的内容FB5A4BAF6E53963BAC2B1BA2EAF29DB1

这个是对文本FB5A4BAF6E53963BAC2B1BA2EAF29DB1AES解密后的内容mark

明码预览

  • md5预览
  • sha256预览

  • Base64预览
  • 加盐预览

生成明码预览

  • 加盐预览

好了,web平安明码加解密,生成这块的内容就介绍到这里,当前还会持续补充的。