Java實(shí)現(xiàn)BCrypt密碼加密的示例
1.作用
如果MYSQL數(shù)據(jù)庫被盜,賬號(hào)密碼就全沒了,所以要加密。還有可能蹲號(hào)子
BCrypt特點(diǎn)
- 不可逆加密(無法解密回原文)
- 自動(dòng)加鹽(同一個(gè)密碼每次加密結(jié)果都不一樣)
- 安全、簡單、Spring自帶
2.BCrypt兩個(gè)核心方法
- 加密:BCrypt.hashpw(明文密碼,BCrypt.gensalt())
- 驗(yàn)證:BCrypt.checkpw(明文密碼,加密后密碼)
3.迭代一下登錄代碼
注冊(cè)時(shí)→密碼加密存儲(chǔ)
UserController.java注冊(cè)部分:
@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";
}登陸時(shí)→對(duì)比驗(yàn)證
重點(diǎn):不能用where password=?查詢!必須先查用戶,再比對(duì)密碼!
UserController.java登錄部分:
@PostMapping("/login")
public String login(String username, String password, HttpSession session) {
// 1. 只根據(jù)用戶名查用戶
User user = userService.findByUsername(username);
if (user == null) {
return "fail";
}
// 2. 使用 BCrypt 校驗(yàn)密碼(明文 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.最終效果
- 數(shù)據(jù)庫里密碼長這樣:
$2a$10$xxxxxxx...
- 任何人都無法反查原文
- 即使數(shù)據(jù)庫泄露,密碼也沒用
- 企業(yè)標(biāo)準(zhǔn)安全方案
5.總結(jié)
密碼不能明文存儲(chǔ),必須使用 BCrypt 不可逆加密,自動(dòng)加鹽,每次加密結(jié)果不同,登錄時(shí)通過 checkpw 方法比對(duì),安全性極高。
到此這篇關(guān)于Java實(shí)現(xiàn)BCrypt密碼加密的示例的文章就介紹到這了,更多相關(guān)Java BCrypt密碼加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中EasyExcel實(shí)現(xiàn)execl導(dǎo)入導(dǎo)出
本文主要介紹了SpringBoot中EasyExcel實(shí)現(xiàn)execl導(dǎo)入導(dǎo)出,實(shí)現(xiàn)了如何準(zhǔn)備環(huán)境、創(chuàng)建實(shí)體類、自定義轉(zhuǎn)換器以及編寫導(dǎo)入邏輯的步驟和示例代碼,感興趣的可以了解下2023-06-06
SpringBoot?OpenFeign整合okHttpClient實(shí)踐
SpringCloud默認(rèn)使用JDK自帶HttpURLConnection進(jìn)行數(shù)據(jù)傳輸,但沒有連接池,意味著每發(fā)起一個(gè)請(qǐng)求都會(huì)創(chuàng)建一個(gè)新連接,為提高系統(tǒng)的穩(wěn)定,需要使用池化技術(shù),這里使用OkHttpClient進(jìn)行池化配置,并給出配置示例和注意事項(xiàng)2026-04-04
Java 實(shí)用工具類Spring 的 StopWatch常用方法
StopWatch 是 Spring 框架中極其實(shí)用的開發(fā)輔助工具,它為性能分析和調(diào)試提供了輕量但強(qiáng)大的能力,使用簡單、無需復(fù)雜配置,本文給大家介紹Java 實(shí)用工具類Spring 的 StopWatch常用方法,感興趣的朋友一起看看吧2025-04-04
Java 基于tcp協(xié)議實(shí)現(xiàn)文件上傳
這篇文章主要介紹了Java 基于tcp協(xié)議實(shí)現(xiàn)文件上傳,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11
SpringMVC深入講解文件的上傳下載實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了springMVC實(shí)現(xiàn)文件上傳和下載的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Spring?Cloud?Gateway?2.x跨域時(shí)出現(xiàn)重復(fù)Origin的BUG問題
這篇文章主要介紹了Spring?Cloud?Gateway?2.x跨域時(shí)出現(xiàn)重復(fù)Origin的BUG問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
詳解如何通過Java實(shí)現(xiàn)壓縮PDF文檔
PDF文檔是我們?nèi)粘^k公中使用最頻繁的文檔格式。但因?yàn)榇蠖鄶?shù)PDF文檔都包含很多頁面圖像或大量圖片,這就導(dǎo)致PDF文檔過大,處理起來較為麻煩。本文將介紹如何通過Java應(yīng)用程序壓縮PDF文檔,需要的可以了解一下2022-12-12

