JavaWeb(苍穹外卖)--学习笔记05(MD5)
前言
本片文章是学习B站黑马程序员苍穹外卖的学习笔记。我的学习路线是Java基础语法-JavaWeb-做项目,外卖程序的开发还是比我之前学JavaWeb图书管理系统多很多功能的,其登录功能加入了MD5密码加密🙌(其实这段我也没太听懂,我又结合ai理解了一下 )。
🛠️先来看看什么是MD5:
MD5:是一种常用的哈希算法,用于生成数据的“指纹”对密码加密。
🙌在来看看其在项目中的使用:
-
因为是对密码的加密,所以更改数据库中的密码改为加密后的:
123456—> e10adc3949ba59abbe56e057f20f883e -
总体看看后端代码:
@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());
- password.getBytes()
作用:把字符串(比如 “123456”)转换成字节数组(byte[]),因为加密算法操作的是二进制数据。
"hello".getBytes() → [104, 101, 108, 108, 111]
- DigestUtils.md5DigestAsHex(…)
作用:使用 Apache Commons Codec 提供的 DigestUtils 工具类,对传入的字节数组进行 MD5 哈希计算,并将结果转为 16 进制字符串
String password = "123456";
String md5 = DigestUtils.md5DigestAsHex(password.getBytes());
System.out.println(md5); // 输出:e10adc3949ba59abbe56e057f20f883e
⚠️ ai还给出了缺点(可能这个外卖的课是几年前的所以还是有点落后的):
- 存在碰撞攻击风险
- 容易被彩虹表破解(尤其是弱密码)
- 不建议直接用于现代系统的密码加密