zoukankan      html  css  js  c++  java
  • Node加解密原理和功能探索总结

    导语:随着网络的飞速发展,网络安全问题也越来越严重。今天说一下在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个字节长度数据,称作消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据是否发生改变,即验证其完整性。

    感兴趣的可以看下以下几篇文章详细了解下内容:

    方法实现

    文本加解密

    这里主要是使用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安全密码加解密,生成这块的内容就介绍到这里,以后还会继续补充的。

  • 相关阅读:
    让Web站点崩溃最常见的七大原因
    git常用命令
    VMware 虚拟网卡介绍和使用说明
    jQuery 发送 ajax 跨域请求,java 后端配置允许跨域
    svn 提交报错,提示:locked,需要 cleanup
    设置mysql允许外部连接访问
    Splunk和ElasticSearch深度对比解析(转)
    elastalert新增自定义警告推送
    nodejs(log4js)服务中应用splunk进行Log存储、搜索、分析、监控、警告
    elasticsearch License 到期后更新步骤
  • 原文地址:https://www.cnblogs.com/guanqiweb/p/14992282.html
Copyright © 2011-2022 走看看