关于node.js:Node加解密原理和功能探索总结

5次阅读

共计 3175 个字符,预计需要花费 8 分钟才能阅读完成。

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

正文完
 0