当前位置: 首页 > backend >正文

JavaWeb(苍穹外卖)--学习笔记05(MD5)

前言

本片文章是学习B站黑马程序员苍穹外卖的学习笔记。我的学习路线是Java基础语法-JavaWeb-做项目,外卖程序的开发还是比我之前学JavaWeb图书管理系统多很多功能的,其登录功能加入了MD5密码加密🙌(其实这段我也没太听懂,我又结合ai理解了一下 )。

🛠️先来看看什么是MD5:

MD5:是一种常用的哈希算法,用于生成数据的“指纹”对密码加密。

🙌在来看看其在项目中的使用:

  1. 因为是对密码的加密,所以更改数据库中的密码改为加密后的:
    123456—> e10adc3949ba59abbe56e057f20f883e

  2. 总体看看后端代码

@Service
public class EmployeeServiceImpl implements EmployeeService {@Autowiredprivate EmployeeMapper employeeMapper;public Employee login(EmployeeLoginDTO employeeLoginDTO) {String username = employeeLoginDTO.getUsername();String password = employeeLoginDTO.getPassword();//1、根据用户名查询数据库中的数据Employee employee = employeeMapper.getByUsername(username);//2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)if (employee == null) {//账号不存在throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);}//密码比对// TODO 后期需要进行md5加密,然后再进行比对password = DigestUtils.md5DigestAsHex(password.getBytes());if (!password.equals(employee.getPassword())) {//密码错误throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);}if (employee.getStatus() == StatusConstant.DISABLE) {//账号被锁定throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);}//3、返回实体对象return employee;}

从在service层的位置可以看出,其作用其实就是,在后端收到前端用户输入的密码后,把用户的密码进行加密后处理,再和数据库中存储的密码对比

🧠 分步解析:我们来逐行解释这段代码

password = DigestUtils.md5DigestAsHex(password.getBytes());
  1. password.getBytes()

作用:把字符串(比如 “123456”)转换成字节数组(byte[]),因为加密算法操作的是二进制数据。

"hello".getBytes()[104, 101, 108, 108, 111]
  1. DigestUtils.md5DigestAsHex(…)

作用:使用 Apache Commons Codec 提供的 DigestUtils 工具类,对传入的字节数组进行 MD5 哈希计算,并将结果转为 16 进制字符串

String password = "123456";
String md5 = DigestUtils.md5DigestAsHex(password.getBytes());
System.out.println(md5); // 输出:e10adc3949ba59abbe56e057f20f883e

⚠️ ai还给出了缺点(可能这个外卖的课是几年前的所以还是有点落后的):

  1. 存在碰撞攻击风险
  2. 容易被彩虹表破解(尤其是弱密码)
  3. 不建议直接用于现代系统的密码加密
http://www.xdnf.cn/news/15287.html

相关文章:

  • 2D转换之缩放scale
  • Cursor创建Spring Boot项目
  • 关于赛灵思的petalinux zynqmp.dtsi文件的理解
  • 网络连接:拨号连接宽带PPPOE
  • 使用 Java 开发大数据应用:Hadoop 与 Java API 的结合
  • Golang 面向对象(封装、继承、多态)
  • Eureka实战
  • Git企业级开发(多人协作)
  • 【设计模式】装饰(器)模式 透明装饰模式与半透明装饰模式
  • Java生产带文字、带边框的二维码
  • Flink创建执行环境的三种方式,也是Flink搭建程序的第一步
  • React 组件中怎么做事件代理?它的原理是什么?
  • MyBatis实现分页查询-苍穹外卖笔记
  • openGauss数据库管理实战指南——基本常用操作总结
  • Sentry 集成
  • 【王树森推荐系统】行为序列02:DIN模型(注意力机制)
  • 【LeetCode453.最小操作次数使数组元素相等】
  • 深入解析C#接口实现的两种核心技术:派生继承 vs 显式实现
  • 论文阅读:HybridTrack: A Hybrid Approach for Robust Multi-Object Tracking
  • 前端开发中的资源缓存详解
  • 面试现场:奇哥扮猪吃老虎,RocketMQ高级原理吊打面试官
  • Spring Ai Alibaba Gateway 实现存量应用转 MCP 工具
  • AI领域的黄埔军校:OpenAI是新一代的PayPal Mafia,门生故吏遍天下
  • 浅谈 Python 中的 yield——生成器对象与函数调用的区别
  • 力扣 hot100 Day42
  • 若依前后端分离Vue3版本接入阿里云OSS
  • 20250712-1-Kubernetes 监控与日志管理-K8s日志管理与维护_笔记
  • Softmax回归(多类逻辑回归)原理及完整代码示例实现
  • 一个基于数据库的分布式锁:乐观与悲观实现
  • 贪心算法题解——跳跃游戏【LeetCode】