BCrypt密码加密

1.作用

如果MYSQL数据库被盗,账号密码就全没了,所以要加密。还有可能蹲号子

BCrypt特点

  • 不可逆加密(无法解密回原文)
  • 自动加盐(同一个密码每次加密结果都不一样)
  • 安全、简单、Spring自带

2.BCrypt两个核心方法

  1. 加密:BCrypt.hashpw(明文密码,BCrypt.gensalt())
  2. 验证:BCrypt.checkpw(明文密码,加密后密码)

3.迭代一下登录代码

注册时→密码加密存储

UserController.java注册部分:

复制代码

@PostMapping("/register") public String register(@RequestBody User user) { // 明文密码加密 String rawPassword = user.getPassword(); String encodePassword = BCrypt.hashpw(rawPassword, BCrypt.gensalt()); user.setPassword(encodePassword); // 存入加密后的密码 userService.register(user); return "success"; }

登陆时→对比验证

重点:不能用where password=?查询!必须先查用户,再比对密码!

UserController.java登录部分:

复制代码

@PostMapping("/login") public String login(String username, String password, HttpSession session) { // 1. 只根据用户名查用户 User user = userService.findByUsername(username); if (user == null) { return "fail"; } // 2. 使用 BCrypt 校验密码(明文 vs 密文) boolean ok = BCrypt.checkpw(password, user.getPassword()); if (ok) { session.setAttribute("loginUser", user); return "success"; } else { return "fail"; } }

UserService增加方法

复制代码

public User findByUsername(String username) { return userMapper.findByUsername(username); }

UserMapper增加

复制代码

User findByUsername(String username);

User Mapper.XML增加

复制代码

<select id="findByUsername" resultType="com.example.easy_add_del_change_select.pojo.User"> select * from user where username=#{username} </select>

4.最终效果

  • 数据库里密码长这样:

$2a$10$xxxxxxx...

  • 任何人都无法反查原文
  • 即使数据库泄露,密码也没用
  • 企业标准安全方案

5.总结

密码不能明文存储,必须使用 BCrypt 不可逆加密,自动加盐,每次加密结果不同,登录时通过 checkpw 方法比对,安全性极高。

相关推荐
dialect_8 小时前
KMP算法
开发语言·c++·算法
总要学点什么8 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
前端精髓9 小时前
结构化输出with_structured_output(抽卡)
python·langchain
尹人入圣9 小时前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
开开心心_Every10 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
chenbingjie_c10 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
Nuanyt10 小时前
Agent 学习笔记(下篇三):上线工程、进阶选择与操作界面(Stage 7 / 7.5 / 8 + 延伸路线)
笔记·python·学习·memory·aiagent·harness
吴卫斌10 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
2601_9679873711 小时前
Python——入门级(定义功能def函数)
python·函数·可变参数·默认参数·关键字参数
超级架构师11 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core