登录安全----双重MD5加密实现安全登录

article/2025/9/18 10:52:56

 个人简介:

📦个人主页:肇事司机赵四
🏆学习方向:JAVA后端开发
📣种一棵树最好的时间是十年前,其次是现在!
🧡喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。

目录

一:🧸问题引入

二:🧸解决方案

2.1:第一次加密

2.2:第二次加密

2.3:具体实现

2.3.1:用户注册

2.3.2:用户登录

三:🧸代码实现

3.1:第一次加密

3.1.1:前端

3.1.2:后端

 3.2:第二次加密

3.2.1:前端

3.2.2:后端


一:🧸问题引入

今天看到一篇文章说使用MD5对密码进行加密存储也还不能做到很安全,网上有在线解密MD5的网站,我一搜,还真有。接下来我尝试对我存储在数据库中的密码进行解密操作:

fb3013eaa3354b509420113da9d5afe7.png

837987e7457a4e1186c4dcf916dcb66e.png

 可以看到成功将我的密码解密出来,这让我很吃惊,因为我们都知道MD5算法是不可逆的,因为它是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。那么为什么网站中可以将我的密码解密出来呢?

经过一番查找后发现,原来在线解密工具的解密原理很简单,其原理是收集用户常用的简单密码形成了一个密码字典,并将字典中的密码用MD5加密后存储起来,在所谓的“解密“的时候,就将真正用户密码加密都的密文与已存储的密码相比较,如该密文存在于字典当中,即可以“解密”。因此,简单的用MD5对用户密码加密还不安全,我们设置密码时候也通常都会有复杂度检测,比如密码必须带英文数字什么的,就是为了安全性考虑。

知道其解密原理之后,我们尝试一下复杂点的密码看看能不能“解密”出来,首先对密码“qweasd666”进行加密:

5e98f258fa3643fa974ca931577d4e1f.png

 加密之后我们选取32位小写的密文进行解密操作:

b95fa649d9234f839734b42c8fd464ce.png

 可以看到解密失败,说明其原理就是我们上面所说的收集常用的密文进行一一对应。既然解密失败了,那么说明“qweasd666”这个密码是安全的,你们可以都设置这个密码(doge)。

言归正传,说到这个网站成功将我精心设置的密码给破解了,这让我很没有安全感,而且我感觉我很没有面子,我一定要将我的登录安全等级进行提升。

除了上面提到的解密操作之外,还有一个很大的问题就是在前端将数据传输过来时候http采用的是明文传输,如果传输数据包被截取,那么就算你后端的加密算法有多复杂,你的密码也会被别人知道。

二:🧸解决方案

2.1:第一次加密

找到问题所在之后,我们就可以对症下药了,首先我觉得要解决的是http明文传输问题,因为这个风险最大,普通抓包就能抓取密码,这不是很恐怖的一件事吗。解决方案也很简单,既然明文传输不安全,那么我们加密后再进行传输不就行了吗?

我选用的方案仍然还是MD5加密,但是对密码加密前还要加入一个固定salt。salt?是加盐吗,其实差不多,更不如说是加点“佐料”。其基本想法是这样的:当用户首次提供密码时(通常是注册时),由程序往这个密码里撒一些“佐料”,为了减轻开发压力,这个佐料对于每一个用户都是相同的,然后再散列。这样就能防止传输过程中出现明文密码泄露。

2.2:第二次加密

注意上面我提到的是防止出现明文密码泄漏,但是这并不代表密文不会泄漏,假如黑客截取你通过http传输的经过加密后的密码,或者数据库发生泄漏导致加密后的密码被黑客盗取,黑客通过解析前端js文件获得前端固定盐值,那么黑客可能可以通过彩虹表进行反向查询得到原始密码。这时候就二次加密的重要性就出来了,二次加密实现原理为对前端传过来经过加密之后的密码再次和一个随机Salt值结合后进行加密(注意这次是随机的),盐值会在用户登陆的时候随机生成,并存在数据库中。

这时候可能你会和我刚开始一样也会有一个疑惑,那就是你把随机盐值保存到数据库中了,那么如果数据库泄漏那你的随机盐值还有什么作用呢?黑客拿到加密数据进行解密后去除盐值不是就能得到密码了吗?是的,黑客有可能通过这样的手段得到密码,但是前提是他能解密出来,要知道的是MD5是无法直接破解的,只能通过穷举法进行解密。就算黑客拿到了数据库中的加密密码,但是不知道后端的加密过程,他就无法进行解析,就算黑客同时知道加密过程,由于经过了二次加盐二次加密,这时候的密文是很难很难被解析出来的,随着加密数据的复杂度增加,破解成本是呈指数级增加的,在那么大的成本面前相信没有什么黑客愿意去尝试。当然,salt也不一定要加在最前面或最后面,也可以插在中间,也可以分开插入,也可以倒序,程序设计时可以灵活调整,都可以使破解的难度呈指数型增长。

2.3:具体实现

2.3.1:用户注册

  1. 前端对用户输入的密码进行md5加密(固定的salt)
  2. 将加密后的密码传递到后端
  3. 后端随机生成一个salt
  4. 使用生成salt对前端传过来的密码进行加密,然后将加密后密码和salt一起保存到db中

2.3.2:用户登录

  1. 前端对用户输入的密码进行md5加密(固定的salt)
  2. 将加密后的密码传递到后端
  3. 后端使用用户账号取出用户信息
  4. 后端对加密后的密码在进行md5加密(取出盐),然后与数据库中存储的密码进行对比
  5. 匹配则登录成功,否则登录失败

三:🧸代码实现

3.1:第一次加密

3.1.1:前端

const params = {...this.ruleForm,sex: this.ruleForm.sex === '女' ? '0' : '1',//设置密码加密(加上固定salt值)password: md5(this.ruleForm.password + this.salt)
}
addEmployee(params).then(res => {if (res.code === 1) {this.$message.success('员工添加成功!')if (!st) {this.goBack()} else {this.ruleForm = {username: '','name': '','phone': '',password: '',// 'rePassword': '',/'sex': '男','idNumber': ''}}} else {this.$message.error(res.msg || '操作失败')}
}

3.1.2:后端

/**
* 添加员工
*/
@PostMapping
public R<String> save(@RequestBody Employee employee){//生成随机salt值String salt = RandomStringUtils.randomAlphanumeric(5);//设置随机盐值employee.setSalt(salt);//设置密码二次加密employee.setPassword(DigestUtils.md5DigestAsHex((salt + employee.getPassword()).getBytes()));boolean save = employeeService.save(employee);if(save){return R.success("添加成功!");}return R.error("添加失败!");
}

 3.2:第二次加密

3.2.1:前端

const params = {...this.loginForm,//登录密码加上固定盐值后发送password: md5(this.loginForm.password + this.salt),
}
let res = await loginApi(params)
if (String(res.code) === '1') {localStorage.setItem('userInfo', JSON.stringify(res.data))window.location.href = '/backend/index.html'
} else {this.$message.error(res.msg)this.loading = false
}

3.2.2:后端

/*** 员工登录*/
@PostMapping("/login")
public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){//1.获取传输过来的加密后的密码值String encryPassword = employee.getPassword();//2.从数据库中获取用户信息LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();lqw.eq(Employee::getUsername,employee.getUsername());Employee emp = employeeService.getOne(lqw);//3.如果没有查询到则返回登陆失败查询结果if(emp == null){return R.error("没有查询到该用户信息!");}//4.获取注册时保存的随机盐值String salt = emp.getSalt();//5.将页面提交的密码password进行md5二次加密String password = DigestUtils.md5DigestAsHex((salt + encryPassword).getBytes());//6.密码比对,如果不一致则返回登陆失败结果if(!emp.getPassword().equals(password)){return R.error("密码错误!");}//7.查看员工状态是否可用if(emp.getStatus() == 0){return R.error("该员工已被禁用!");}//8.登录成功,将员工id存入Session对象并返回登录成功结果request.getSession().setAttribute("employee",emp.getId());return R.success(emp);
}


http://chatgpt.dhexx.cn/article/FxwnQjUx.shtml

相关文章

http登录模块加密登录安全登录方法

http请求很容易被截获&#xff0c;在写登录模块时&#xff0c;直接使用明文密码请求&#xff0c;很容易明文密码泄露&#xff1b;若在js页面对密码进行一次加密后在传输&#xff0c;虽不是明文密码&#xff0c;但也完全可以截获加密后的暗文&#xff0c;伪造http请求进行登录。…

安全登录认证

用户登录是任何一个应用系统的基本功能&#xff0c;特别是对于网上银行系统来说&#xff0c;用户登录的安全性尤为重要。如何设计一个网站的安全登录认证程序&#xff0c;是本文主要讨论的问题。 静态密码存在着比较多的安全隐患&#xff0c;攻击者有很多手段获得静态密码&…

Web登录如何确保安全

1、一个普通简单的HTML例子&#xff0c;用户登录信息是不安全的 <form action "http://localhost:8080/Application/login" method "POST"> 用户名&#xff1a;<input id"username" name"username" type"te…

实现安全登录的两种方法

登录安全——拦截器和过滤器或权限框架的使用 本次我们将采用两种方法实现登录的安全性&#xff0c;首先介绍拦截器和过滤器。 一、 过滤器和拦截器&#xff1a; 过滤器产生的时间/开始工作的时间&#xff1a; 进入Tomcat之后&#xff0c;但是在进servlet之前。Interceptor进入…

推荐几款优秀的搜素引擎

秘迹搜索 网址&#xff1a;https://mijisou.com/ 秘迹搜索是一款守护用户搜索信息的聚合搜索引擎&#xff0c;Ta不会根据搜索关键词追踪用户&#xff0c;也不会通过历史搜索内容做广告推荐。秘迹搜索通过聚合中文搜索服务比如Bing、百度、360、搜狗等搜索结果提供私密搜索服务…

12.推荐几款好用的搜索引擎

1.goobe https://goobe.io/ 专为程序员设计的搜索引擎&#xff08;搜索非技术相关的东西也很6&#xff09;&#xff0c;界面是这样事儿的 而且可以通过快照访问stackoverflow和github&#xff0c;非常好用 无广告&#xff0c;不跟踪 2.萌搜 https://mengso.com/ 号称小众的…

《搜索和推荐中的深度匹配》——1.1搜索和推荐

重磅推荐专栏&#xff1a; 《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers&#xff0c;轻松构建属于自己的NLP智能应用&#xff01; 随着Internet的快速发展&#xff0c;当今信息科学的基本问题之一变得更加重要&#xff0c;即如何从通常庞大的信息库中…

基于Elasticsearch实现搜索推荐

在基于Elasticsearch实现搜索建议一文中我们曾经介绍过如何基于Elasticsearch来实现搜索建议&#xff0c;而本文是在此基于上进一步优化搜索体验&#xff0c;在当搜索无结果或结果过少时提供推荐搜索词给用户。 背景介绍 在根据用户输入和筛选条件进行搜索后&#xff0c;有时…

五个小众好用的搜索引擎

一、wikiHow https://zh.wikihow.com/ 我把wikiHow当做一个帮我做任何事的搜索引擎 wikiHow上每一篇详尽明了的指南文章 都能改善成百上千人的生活 与维基百科类似&#xff0c;wikiHow 也采用了维基技术 所有人都可以创建或编辑文章中的内容 来自全球的协作者们已编写了…

阿里搜索推荐系统

一、系统框架 导购升级的优化思路从三个方向着手&#xff1a;1.策略升级。利用深度学习及异构网络的思想&#xff0c;对用户个性化进行更深的理解和建模&#xff1b;同时对因马太效应引起的独立query数下降等问题进行优化。 2.导购外投。在包括会场激活页、猜你喜欢等渠道进行搜…

推荐和搜索系统的多样性研究综述

前言 检索结果的多样化是检索系统的一个重要研究课题&#xff0c;其可以满足用户的各种兴趣和供应商的平等公平曝光。 然而&#xff0c;检索系统中&#xff08;搜索与推荐领域&#xff09;的多样性研究缺乏一个系统的汇总&#xff0c;并且研究点相对零散。本次介绍的paper中&am…

从零开始搭建搜索推荐系统(五十二)ElasticSearch搜索利器

聊的不止技术。跟着小帅写代码&#xff0c;还原和技术大牛一对一真实对话&#xff0c;剖析真实项目筑成的一砖一瓦&#xff0c;了解最新最及时的资讯信息&#xff0c;还可以学到日常撩妹小技巧哦&#xff0c;让我们开始探索主人公小帅的职场生涯吧&#xff01; &#xff08;PS…

《智能搜索和推荐系统》总结

这本书主要分为4部分介绍&#xff0c;分别是搜索和推荐的基础&#xff0c;搜索系统基本原理&#xff0c;推荐系统的基本原理&#xff0c;工程应用。 第一部分&#xff1a;搜索和推荐的基础 主要讲了一下概率统计与应用数学的基础知识&#xff0c;比如概率论基础&#xff08;概率…

推荐系统与搜索引擎的差异

转自&#xff1a;https://blog.csdn.net/cserchen/article/details/50422553 详细分析推荐系统和搜索引擎的差异陈运文 从信息获取的角度来看&#xff0c;搜索和推荐是用户获取信息的两种主要手段。无论在互联网上&#xff0c;还是在线下的场景里&#xff0c;搜索和推荐这两种方…

商品搜索引擎---推荐系统设计

一、前言 结合目前已存在的商品推荐设计&#xff08;如淘宝、京东等&#xff09;&#xff0c;推荐系统主要包含系统推荐和个性化推荐两个模块。 系统推荐&#xff1a; 根据大众行为的推荐引擎&#xff0c;对每个用户都给出同样的推荐&#xff0c;这些推荐可以是静态的由系统管…

推荐一些不常见的搜索引擎

5.雅虎网 来自 Yahoo.com 的屏幕截图&#xff0c;2023 年 2 月 截至 2022 年 1 月&#xff0c;Yahoo.com&#xff08;Verizon Media&#xff09;的搜索市场份额为 11.2%。 雅虎的优势在于多元化&#xff0c;除搜索外还提供电子邮件、新闻、金融等服务。 二十多年来&#xff0c;…

相关搜索 --- 搜索中的推荐

0. 前面的瞎扯淡 互联网从开始出现&#xff0c;如果就信息获取方面的话&#xff0c;到现在经历了三个大的时期&#xff0c;最开始是人工信息的分类时期&#xff0c;作为一个上了岁数的人&#xff0c;是经历过那个时期的&#xff0c;那个时期如何来找信息呢&#xff1f;我们来看…

基于机器学习的搜索推荐系统

目录 一&#xff0e; 引言 1 二&#xff0e; 准备 2 一&#xff0e; 软件工程语言选择 2 二&#xff0e; 服务器的选取 2 三&#xff0e; 搜索服务 5 一&#xff0e; 搜索服务软件目录结构 5 二&#xff0e; 搜索服务功能 6 三&#xff0e; SPARQL语句分析 7 四&#xff0e; 经…

超好用的搜索引擎推荐

搜索引擎是我们信息资料搜集的最重要的渠道之一,用搜索引擎查找信息资料需要使用恰当的关键词和一些搜索技巧。目前国内主要的搜集引擎有如下10个,近期还有较多行业 型搜索冒出来,需找专业型行业资料可以使用行业型搜索引擎。 由于每个搜索引擎都有一定的局限性,可以把要…

搜索推荐相关

搜索算法 Learning to Rank方法&#xff1a; 1、单文档方法&#xff1a;根据query判断每个item的相似度 2、文档对方法&#xff1a;确定文档对的前后顺序 3、文档列表法&#xff1a;确定所有文档的先后顺序 Item&#xff1a;垂域、意图、语义相似性、item的热度、用户的搜索日…