用户密码的加密解密操作(前端加密,后端解密)
用户密码的加密解密操作
- 作者是个小菜狗,行文过程基本都基于自己理解,没有深入查阅文献,如有错误,还请大神指出
背景:
公司做的是一个某某平台的系统,包括前台和后台,作者刚毕业,刚开始试用,带我的师傅让我实现密码的加密解密,说实话,都有封装好的api,直接调用什么的,真的没啥难度,后来被其他小事情耽搁了,回过头来,前辈已经做好了,就叫我好好看看,理解下,嗯嗯……其实我也能做好的。
1、流程
先说说加密的需要,http协议默认情况下是以明文进行传输的,即没有对网上传输的数据进行加密的,别人如果通过抓包工具抓取传输数据,是可以直接进行阅读的,这样关键信息,例如密码这种东西在传输时显得很危险,所以对密码进行加密很有必要。
没加密的请求数据
加密后的请求数据
由图可见,加密还是很必要的。
见过两种加密方案,一种是可逆的加密算法,另一种是不可逆的加密算法,像常见的DES是可逆的,即可以通过密钥进行加密和解密,MD5是不可逆的,只能通过再次加密才能判断明文是否相同。
因此,在对加密密码这件事情上,有两种流程
- 用户在前端输入密码,通过js代码对输入的密码进行不可逆加密,然后在后端将密文直接存进数据库。这样的话,就算别人拦截到你的数据包,看到的也只是加密后的密文。这也是为什么一些平台找回密码仅仅是输入新密码,因为他们也没办法获取旧密码
- 用户在前端输入密码,通过js代码对输入的密码进行可逆加密(需要前后端协调好秘钥),传到后端后,再对加密的密文进行解密,然后跟数据库的明文密码进行比较。这样,别人如果不知道秘钥的话,也基本上拦截不到密码。
2、实现
公司这边使用的是可逆的加密算法,也就是第二个方案,这种方案的好处,嘿嘿,大家都喜欢在不同的平台使用相同的密码,大家都懂的。
前端实现
公司在vue框架中使用的是crypto-js,但无论是什么框架,应该都差不多吧,面向百度编程,你需要的百度上基本都有。
- 引入依赖
vue中比较简单,直接使用 npm install crypto-js 进行安装
然后在使用的时候通过 import CryptoJS from ‘crypto-js’ 引入就可以
- 写js工具包
然后就可以写其的工具包了,例如公司里实现的js工具包,写工具包只是为了重用,还是建议经常写工具方法,这样直接把文件一复制就能直接调用。
创建一个js文件,键入:
import CryptoJS from 'crypto-js';export default {//随机生成指定数量的16进制keygeneratekey(num) {let library = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let key = "";for (var i = 0; i < num; i++) {let randomPoz = Math.floor(Math.random() * library.length);key += library.substring(randomPoz, randomPoz + 1);}return key;},//加密encrypt(word, keyStr) {keyStr = keyStr ? keyStr : 'XXXXXXXXXXXXX'; //判断是否存在ksy,不存在就用定义好的keyvar key = CryptoJS.enc.Utf8.parse(keyStr);var srcs = CryptoJS.enc.Utf8.parse(word);var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });return encrypted.toString();},//解密decrypt(word, keyStr) {keyStr = keyStr ? keyStr : 'XXXXXXXXXXXXX';var key = CryptoJS.enc.Utf8.parse(keyStr);var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });return CryptoJS.enc.Utf8.stringify(decrypt).toString();}
}
- 调用工具包方法
在vue中,引用js工具包,如下:
import AES from '@/utils/crypto'
直接在方法中调用其方法:
var keys = 'XXXXXXXXXXXXX'
//如果是对象/数组的话,需要先JSON.stringify转换成字符串
let password = AES.encrypt(this.form.password, keys)
这样password就被加密了。
是不是很简单?是不是很easy?哈哈哈
后端实现
后端采用的是Spring Boot框架,基于Java实现
java后端使用的是javax.crypto包,所以不用引依赖。
直接编写加密解密工具类,java类代码如下:
package cn.com.wasec.gd_plice.utils;import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;/*** 登陆密码加密*/
@Slf4j
public class AesUtil {private static final String ALGORITHMS = "AES/ECB/PKCS5Padding";/*** 加密** @param content 内容* @param key key* @return java.lang.String*/public static String encrypt(String content, String key) {try {//获得密码的字节数组byte[] raw = key.getBytes();//根据密码生成AES密钥SecretKeySpec skey = new SecretKeySpec(raw, "AES");//根据指定算法ALGORITHM自成密码器Cipher cipher = Cipher.getInstance(ALGORITHMS);//初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥cipher.init(Cipher.ENCRYPT_MODE, skey);//获取加密内容的字节数组(设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码byte[] byteContent = content.getBytes(StandardCharsets.UTF_8);//密码器加密数据byte[] encodeContent = cipher.doFinal(byteContent);//将加密后的数据转换为字符串返回return Base64.encodeBase64String(encodeContent);} catch (Exception e) {e.printStackTrace();return null;}}/*** 解密** @param encryptStr 加密后的内容* @param decryptKey 解密key* @return java.lang.String*/public static String decrypt(String encryptStr, String decryptKey) {try {//获得密码的字节数组byte[] raw = decryptKey.getBytes();//根据密码生成AES密钥SecretKeySpec skey = new SecretKeySpec(raw, "AES");//根据指定算法ALGORITHM自成密码器Cipher cipher = Cipher.getInstance(ALGORITHMS);//初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥cipher.init(Cipher.DECRYPT_MODE, skey);//把密文字符串转回密文字节数组byte[] encodeContent = Base64.decodeBase64(encryptStr);//密码器解密数据byte[] byteContent = cipher.doFinal(encodeContent);//将解密后的数据转换为字符串返回return new String(byteContent, StandardCharsets.UTF_8);} catch (Exception e) {log.error("String : {} aes decrypt error", encryptStr);return null;}}
}
直接调用静态方法
String passWord= AesUtil.decrypt(loginDTO.getPassword(),"XXXXXXXXXXXXXX");
至此,后端实现结束。
3、总结
总之,加密和解密在实际业务中还是很必要的,而选择哪样的方式加密自己斟酌。
另外,以上例子中其实存在些许问题,例如秘钥写死在前端代码中,这样其实别人是可以通过抓取你的js文件进行分析获取的,建议通过后端获取。
如果对安全要求更高的话,还是建议使用https吧
用户密码的加密解密操作(前端加密,后端解密)相关推荐
- ss加密php,js前端加密,php后端解密(crypto-js,openssl_decrypt)
基于PHP和JS的AES相互加密解密方法详解(CryptoJS) 基于PHP和JS的AES相互加密解密方法详解(CryptoJS) 注意说明: 1. 首先引入CryptoJS包中的aes.js和pad ...
- 前端加密(纯前端加密不保险,请谨慎使用,尽量后台加密)
第一种:jsencrypt 第一步:引入js <script src="http://minio.zt.hnic.com.cn/zyy/webapp/jsencrypt.min.js& ...
- Java 前端加密传输后端解密以及验证码功能
1. 加密解密 1.1 前端js加密概述 对系统安全性要求比较高,那么需要选择https协议来传输数据.当然很多情况下一般的web网站,如果安全要求不是很高的话,用http协议就可以了.在这种情况下, ...
- 微服务网关鉴权:gateway使用、网关限流使用、用户密码加密、JWT鉴权
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...
- 微服务网关鉴权——gateway使用、网关限流使用、用户密码加密、JWT鉴权
文章目录 微服务网关鉴权 课程目标 1.微服务网关Gateway 1.1 微服务网关概述 1.2 微服务网关微服务搭建 1.3 微服务网关跨域 1.4 微服务网关过滤器 2 网关限流 2.1 思路分析 ...
- 微服务网关鉴权:gateway使用、网关限流使用 用户密码加密 JWT鉴权
目标 掌握微服务网关Gateway的系统搭建 掌握网关限流的实现 能够使用BCrypt实现对密码的加密与验证 了解加密算法 能够使用JWT实现微服务鉴权 1.微服务网关Gateway 1.1 微服务网 ...
- [转]常见的用户密码加密方式以及破解方法
[作者]张辉,就职于携程技术中心信息安全部,负责安全产品的设计与研发. 作为互联网公司的信息安全从业人员经常要处理撞库扫号事件,产生撞库扫号的根本原因是一些企业发生了信息泄露事件,且这些泄露数据未加密 ...
- 使用AES加密进行前端加、解密
什么是AES对称加密? 1.aes对称加密是最快速.简单的一种加密方式,加密(encryption).解密(decryption)使用的是同一套密钥(secret key): 2.aes(advanc ...
- java和js实现前端加密后端解密,后端加密前端解密(Base64)
目录 1.前端加密后端解密 2.后端加密前端解密 在前端和后端数据传输时,常常涉及到隐私数据的传输(例如用户名和密码),这时,我们就需要对隐私数据进行加密解密 1.前端加密后端解密 1.1 前端jqu ...
- 常见的用户密码在后台数据库中加密存储方式
转载自:https://blog.csdn.net/ctrip_tech/article/details/80125741 一.用户密码加密 用户密码保存到数据库时,常见的加密方式有哪些,我们该采用什 ...
最新文章
- Xamarin Essentials教程语音播报TextToSpeech
- HTTP协议 -- TCP/IP通信传输流
- English trip EM2-LP-3A Gifts Teacher:Patrick
- jenkins 手动执行_Jenkins环境配置篇-增加节点
- 接口测试用例模板_《测试用例知识大全》----测试用例所有疑问,只需这篇就够了...
- 【IDEA】Command line is too long. Shorten command ... or also for Application default configuration
- 错误C2398:从“double”转换为“float”需要缩小转换
- 知识蒸馏 | 知识回顾
- 免费自学编程的12个网站
- 推荐一个超干货的计算机视觉社区!
- MyBatis工作流程及配置
- Xshell免费版安装 常用连接linux工具
- 迷宫问题的三种实现算法
- 【Coverity】Jenkins 的 Synopsys Coverity plugin参数配置详解
- 【踩坑】win10迁移系统到移动硬盘, 换系统盘,无法启动等问题
- html树状图在线画板,树状思维导图怎样绘制
- Apple’s Secret? It Tells Us What We Should Love
- linux 系统找回密码,Linux系统密码忘记后的五种恢复方法
- (2020年下半年软件设计师49题)程序设计语言的大多数语法现象可以用CFG(上下文无关文法)表示。下面的CFG产生式集用于描述简单算术表达式,其中+ - * 表示加、减、乘运算,id表示单个字母表示
- IuCS IuPS IuR IuB Uu接口示意图
热门文章
- 2023开学季哪款电容笔值得买?高品质电容笔品牌推荐
- 大数据与人工智能:学习资源收藏
- 谁说硅谷从不996?
- mysql如何打码隐私数据列_MSSQL - 最佳实践 - 如何打码隐私数据列
- CentOS虚拟机通过主机WIFI上网
- 一键生成文章的软件有哪些?将这几个不错的软件分享给你
- mysql share nothing_分布式数据库的Share Nothing / Share Disk / Share Storage
- 纯手工解密几大在线js加密网站(3)
- 词根venge/vent/ver/verb/vers等衍生单词
- 李承鹏“卖拐”了吗?