前端登陆加密解决方案

项目背景

环食药烟草的数据下载模块中,需要判断用户在进行数据下载时是进行了登录操作,如果没有登录要跳转登陆页面,输入账号和密码进行登录。

使用场景

项目中需要前端书写登录页面,用户输入账号密码,前端获取到用户输入的账号密码做登陆操作时需要采用对密码做加密处理。

解决方案

前端通过使用CryptoJS库进行加密处理。CryptoJS库是一种常用的前端加密库,支持多种加密方式,常用的加密方式有:

  1. AES:高级加密标准,目前最常用的对称加密算法之一。可以使用128位、192位或256位密钥进行加密
  2. DES:数据加密标准,一种较早的对称加密算法。可以使用56位密钥进行加密
  3. TripleDES:三重数据加密标准,基于DES算法的一个更安全的版本,可以使用112位或168位密钥进行加密
  4. MD5:消息摘要算法,一种单向哈希函数,常用于对密码进行加密和验证
  5. SHA:安全散列算法,类似于MD5,但更安全,可以使用不同的位数(如SHA-256、SHA-384、SHA-512)进行加密
  6. HMAC:基于哈希函数的消息认证码算法,用于验证数据完整性和真实性

使用指南

  • 使用 npm或者yarn 安装 crypto-js

    npm install crypto-js –save
    yarn add crypto-js
    
  • 在 main.js 引入

    import CryptoJS from “crypto-js”;Vue.prototype.cryptoJS = CryptoJS;
    
  • 在 App.vue 使用

    export default {mounted() {console.log('this.cryptoJS', this.cryptoJS)}
    }
    

    控制台打印内容如下:
    在这里插入图片描述

    说明安装成功,可以在项目中正常使用了~

    可以看出来 crypto-js 库的加密算法有很多。环食药烟草数据下载模块中采用的是 SHA256加密算法SHA256 是一种单向加密算法,意味着对于给定的哈希值,无法通过解密算法直接还原出原始数据。SHA256 算法是不可逆的,这也是其安全性的基础之一,目前没有已知的有效方法可以快速破解它。

  • SHA256算法加密

    const password = 'hello world';
    const res = this.cryptoJS.SHA256(password);
    const plainRes = res.toString(); // 加密的结果
    console.log('password 加密的结果是:', plainRes); // 
    
  • 前后端判断逻辑

    1. 用户输入账号密码
    2. 前端对密码进行 SHA256 算法加密密码
    3. 后端将前端传入的已加密的密码存入数据库
    4. 用户再次登录时根据前端传入的已加密的密码与数据库中存入的密码进行比较,一致说明密码正确;否则错误

其他常用加密算法使用指南

  • AES加密

    // AES 加密
    decrypt(word, key, iv) {let srcs = this.cryptoJS.enc.Utf8.parse(word);const AES_JM_RES = this.cryptoJS.AES.encrypt(srcs, key, {// 对称加密算法主要有AES、DES、3DES / 非对称加密算法主要有RSA、DSA、RCC// iv(初始变量)// key(加密密钥)// mode(加密模式 主要有CBC(默认)、CFB、CTR、OFB、ECB)// padding(填充方式 主要有Pkcs7(默认)、Iso97971、AnsiX923、Iso10126、ZeroPadding)iv: iv,mode: this.cryptoJS.mode.CBC, // 选择模式为CBCpadding: this.cryptoJS.pad.Pkcs7 // 选择填充方式为PKCS7});let encryptedBase64Data = this.cryptoJS.enc.Base64.stringify(AES_JM_RES.ciphertext);return encodeURIComponent(encryptedBase64Data);
    }
    // AES 解密
    encrypt(word, key, iv) {word = decodeURIComponent(word);let encryptedHexStr = this.cryptoJS.enc.Base64.parse(word);let srcs = this.cryptoJS.enc.Base64.stringify(encryptedHexStr);let decrypt = this.cryptoJS.AES.decrypt(srcs, key,{iv: iv,mode: this.cryptoJS.mode.CBC,padding: this.cryptoJS.pad.Pkcs7,});let decryptedStr = decrypt.toString(this.cryptoJS.enc.Utf8);return decryptedStr.toString();
    }// 样例
    const password = 'hello world';
    // 定义加密所需的参数
    const key = this.cryptoJS.enc.Utf8.parse('1234567890abcdef'); // 设置密钥为16字节长度的十六进制字符串
    const iv = this.cryptoJS.enc.Utf8.parse('abcdefghijklmnop'); // 初始化向量也必须是16字节长度的十六进制字符串
    const str = this.decrypt(password, key, iv);
    console.log('加密结果', str);
    const str1 = this.encrypt(str, key, iv);
    console.log('解密结果', str1);
    
  • DES加密

    const password = 'hello world';
    const key = this.cryptoJS.enc.Utf8.parse('123456789');
    const data = this.cryptoJS.enc.Utf8.parse(password);
    // DES 加密
    const encrypted = this.cryptoJS.DES.encrypt(data, key, {mode: this.cryptoJS.mode.ECB, // 选择模式为ECBpadding: this.cryptoJS.pad.Pkcs7 // 选择填充方式为PKCS7
    });
    console.log('DES 加密结果:', encrypted.toString()); // KNugLrX23UddguNoHIO7dw==
    // DES 解密
    const decrypted = this.cryptoJS.DES.decrypt(encrypted, key, {mode: this.cryptoJS.mode.ECB, // 选择模式为ECBpadding: this.cryptoJS.pad.Pkcs7 // 选择填充方式为PKCS7
    });
    console.log('DES 解密结果:', decrypted.toString(this.cryptoJS.enc.Utf8)); // hello world
    
  • MD5加密

    const password = 'hello world';
    const md5Res = this.cryptoJS.MD5(password).toString();
    console.log('password 加密的结果是:', md5Res); // 5eb63bbbe01eeed093cb22bb8f5acdc3
    
  • HMAC加密

    // 示例中采用HMAC-SHA256算法对数据进行加密
    // HMAC并不是一个加密算法,它是一种用于消息认证的技术,因此并不能进行解密操作
    const password = 'hello world';
    const key = this.cryptoJS.enc.Utf8.parse('123456789');
    // 计算 HMAC 
    const hmac = this.cryptoJS.HmacSHA256(password, key);
    console.log('HMAC加密结果:', hmac.toString()); // 9da40d794b56b945a8e382216b9778216326dd187f6b37e921ec28b63a09bdb0
    
  • TripleDES加密

    // 1. 在CryptoJS中,采用WordArray类型来传递数据,简单理解就是words是一个byte数组
    // 2. WordArray的这个对象具有toString()方法,所以在js中是可以直接隐式转换成字符串的,**但是默认是Hex编码(16进制)**
    // 3. 对称解密使用的算法是 `AES-128-CBC`算法,数据采用 `PKCS#7` 填充 , 因此这里的 `key` 需要为16位!const password = 'hello world';
    // 16位十六进制数作为密钥和密钥偏移量
    const key = this.cryptoJS.enc.Utf8.parse('0123456789abcdef'); // 密钥
    const data = this.cryptoJS.enc.Utf8.parse(password);
    // 定义向量(可选参数,如果不指定则会自动生成)
    const iv = this.cryptoJS.enc.Utf8.parse('abcdefghijklmnop'); // 偏移量
    // TripleDES 加密
    const encrypted = this.cryptoJS.TripleDES.encrypt(data, key, {iv: iv,mode: this.cryptoJS.mode.CBC, // 选择模式为CBCpadding: this.cryptoJS.pad.Pkcs7 // 选择填充方式为PKCS7
    });
    console.log('TripleDES 加密结果是:', encrypted.toString()); // sEdwNwrfNcMrMj11iMjKdA==
    const decrypted = this.cryptoJS.TripleDES.decrypt(encrypted, key, {iv: iv,mode: this.cryptoJS.mode.CBC, // 选择模式为CBCpadding: this.cryptoJS.pad.Pkcs7 // 选择填充方式为PKCS7
    });
    console.log('TripleDES 解密结果:', decrypted.toString(this.cryptoJS.enc.Utf8)); // hello world
    
  • Base64加密
    Base64顾名思义,就是基于64个可打印字符来表示二进制数据的一种方法,「注意它并不是一种加密算法」。对于64个打印字符,我们只需要6个二进制位就可以完全表示了。那么我们如何利用8个二进制位来表示只需要6个二进制位就可以完全表示的可打印字符呢?由于2的6次方等于64,所以我们可以将每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。

    // 原生加密
    const btoa = window.btoa('hello, world')  // 编码
    console.log('加密后',btoa) // aGVsbG8sIHdvcmxk
    const atob = window.atob('aGVsbG8sIHdvcmxk')  // 解码
    console.log('解密后',atob) // hello, world// base64插件
    npm install --save js-base64 // 安装// 使用
    import { Base64 } from 'js-base64';const encode = Base64.encode('hello, my name is FuChaoyang'); // 编码
    console.log('插件加密后', encode);
    const decode = Base64.decode('aGVsbG8sIG15IG5hbWUgaXMgRnVDaGFveWFuZyA'); // 解码
    console.log('插件解密后', decode);
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/668184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA——Stream流

1.Stream流的作用(流水线) 结合了Lambda表达式,简化集合、数组的操作; 2.Stream流的使用步骤 ①先得到一条Stream流(流水线),并将数据放上去; ②利用Stream流中的API进行各种操作…

典型数据结构的模板实现

栈和数组 1.使用类模板实现数组结构定长数组可变数组 2.使用类模板实现栈结构 在我们初步了解编写模板类后,应当做一下代码练习。这节我们就做一个编写代码的补充,方便大家继续学习模板类的嵌套。作为新手而言,建议大家先写一个具体类&#x…

iOS 后台任务总结

文章目录 首先Apple官方为我们准备了三类后台任务执行的场景:Background TasksBackground Downloading或者Uploading(后台下载或者上传)Background Long-Running Tasks 声明后台服务类型Playing and Recording Background AudioTracking the User’s LocationImplementing a Vo…

CVPR 2023: GeoLayoutLM Geometric Pre-Training for Visual Information Extraction

我们使用以下6个分类标准对本文的研究选题进行分析: 1. 预训练与微调: 预训练: 模型在未适应特定任务之前如何从大量的未标记数据中学习通用表示。GeoLayoutLM 侧重于“几何预训练”,其涉及设计明确教给模型词语和图像元素之间空间关系的任务。例如,预测相对位置、距离甚至…

protoc结合go完成protocol buffers协议的序列化与反序列化

下载protoc编译器 下载 https://github.com/protocolbuffers/protobuf/releases ps: 根据平台选择需要的编译器,这里选择windows 解压 加入环境变量 安装go专用protoc生成器 https://blog.csdn.net/qq_36940806/article/details/135017748?spm1001.2014.3001.…

QEMU搭建Linux-ARM系统

1、安装QEMU需要的nijia工具 在安装QEMU前需要安装nijia工具,使用ninja1.12会出现bug,更换官网1.11.1版本,就可以正常编译了 下载地址: https://github.com/ninja-build/ninja/releases 配置安装 hudahuawiat:~/workspace/QEMU/…

React 中实现拖拽功能-插件 react-beautiful-dnd

拖拽功能在平时开发中是很常见的,这篇文章主要使用react-beautiful-dnd插件实现此功能。 非常好用,附上GitHub地址:https://github.com/atlassian/react-beautiful-dnd 安装及引入 // 1.引入 # yarn yarn add react-beautiful-dnd# npm npm…

SDL库的下载与配置(Visual Studio )2024/2/4更新

一.SDL的下载 下载链接 二.SDL的环境配置 解压以后放在中文路径下 不会添加环境变量自行搜索&#xff08;比较简单网上教程很多&#xff09; 下面进行编译器的配置 复制这段内容 x64\SDL2main.lib x64\SDL2.lib将这段代码放进去运行一下 #include <SDL.h>int main(int…

MySQL 架构和性能优化

重点&#xff1a; 视图&#xff0c;函数&#xff0c;存储过程&#xff0c;触发器&#xff0c;事件&#xff08; 了解 &#xff09; 用户管理&#xff0c;密码管理 grant revoke 权限管理 MySQL 架构&#xff08; 了解 &#xff09; 存储引擎&#xff1a;MyISAM 和 InnoDB …

Vscode配置STM32开发环境(联合Keil MDK/IAR开发)

Vscode配置STM32开发环境&#xff08;替代Keil MDK/IAR&#xff09; 前言 使用了很长时间的Keil5 MDK&#xff0c;以及最近用了一段时间的IAR for ARM&#xff0c;总体来说体验都不是特别的好&#xff0c;Keil功能还行&#xff0c;也不卡顿&#xff0c;就是开发效率、界面样式…

【蓝桥杯冲冲冲】[NOIP2001 普及组] 装箱问题

蓝桥杯备赛 | 洛谷做题打卡day26 文章目录 蓝桥杯备赛 | 洛谷做题打卡day26题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 题解代码我的一些话 [NOIP2001 普及组] 装箱问题 题目描述 有一个箱子容量为 V V V&#xff0c;同时有 n n n 个物品&#xff0c;每…

echarts使用之柱状图(一)

1 基本使用 核心配置主要是xAxis/yAxis/series <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equi…

2018年苏州大学837复试机试C/C++

2018年苏州大学复试机试 要求 要求用C/C编程&#xff1b;对程序中必要的地方进行注释。上机规则 请在电脑桌面上新建一个文件夹文件夹名为考试姓名&#xff08;中文&#xff09;&#xff1b;考试完毕后&#xff0c;将所编写的文件放在上述文件中。 第一题&#xff08;20分&…

07、全文检索 -- Solr -- Solr 全文检索 之 为索引库添加中文分词器

目录 Solr 全文检索 之 为索引库添加中文分词器添加中文分词器1、添加中文分词器的 jar 包2、修改 managed-schema 配置文件什么是 fieldType 3、添加 停用词文档4、重启 solr5、添加【*_cn】动态字段&#xff0c;并为该字段设置中文分词器6、演示分词器的区别演示 text_cjk 这…

瑞_23种设计模式_建造者模式

文章目录 1 建造者模式&#xff08;Builder Pattern&#xff09;1.1 介绍1.2 概述1.3 创作者模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 模式拓展 ★★★4.1 重构前4.2 重构后 5 总结5.1 建造者模式优缺点5.2 建造者模式使用场景5.3 建造者模式 …

scikit-learn 1.3.X 版本 bug - F1 分数计算错误

如果您正在使用 scikit-learn 1.3.X 版本&#xff0c;在使用 f1_score() 或 classification_report() 函数时&#xff0c;如果参数设置为 zero_division1.0 或 zero_divisionnp.nan&#xff0c;那么函数的输出结果可能会出错。错误的范围可能高达 100%&#xff0c;具体取决于数…

STM32单片机的C语言基础

C语言是单片机开发中的必备基础知识&#xff0c;本文列举了部分STM32学习中比较常见的一些C语言基础知识。 1 位操作 下面我们先讲解几种位操作符&#xff0c;然后讲解位操作使用技巧。C语言支持以下六种位操作&#xff1a; 下面&#xff0c;重点讲解一下位操作在单片机开发中…

Ubuntu文件系统结构

Ubuntu文件系统结构 介绍 Ubuntu是一种备受欢迎的Linux发行版&#xff0c;其文件系统结构以及组织方式是每个使用者和系统管理员都应该了解的重要主题。本篇博客将带您深入探索Ubuntu文件系统的结构&#xff0c;以便更好地理解Linux操作系统的工作原理。 1. 根目录&#xff…

通过servlet设计一个博客系统

博客系统 准备工作servlrt依赖mysql依赖jackson依赖 服务器和数据库的交互设计数据库/数据表封装DBUtil,实现建立连接和断开连接创建实体类bloguser 编写Dao类BlogDaoUserDao 前端和服务器的交互功能一:博客列表页约定格式后端代码前端代码 功能二:实现博客详情页约定格式后端代…

sql相关子查询

1.什么是相关子查询 相关子查询是一个嵌套在外部查询中的查询&#xff0c;它使用了外部查询的某些值。每当外部查询处理一行数据时&#xff0c;相关子查询就会针对那行数据执行一次&#xff0c;因此它的结果可以依赖于外部查询中正在处理的行。 2.为什么要使用相关子…