Java實(shí)現(xiàn)登錄密碼強(qiáng)度校驗(yàn)的項(xiàng)目實(shí)踐
方式1:使用正則表達(dá)式匹配校驗(yàn)
- 不同規(guī)則表達(dá)式
- 密碼必須包含大寫、小寫、數(shù)字和特殊字符,且長度是8位以上
private static final String PWD_REGEX = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*()=_+;':,.?]).{8,}$";
- 密碼必須包含大寫、小寫、數(shù)字和特殊字符,且長度是8-32位
private static final String PWD_REGEX = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*()=_+;':,.?]).{8,32}$";
- 密碼是8-16位字母和數(shù)字的組合
private static final String PWD_REGEX = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$";
可以根據(jù)自己的使用需求,自己組合
- 使用
public class CheckPwdUtil {
/**
* 密碼必須包含大寫、小寫、數(shù)字和特殊字符,且長度是8位以上
*/
private static final String PWD_REGEX = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*()=_+;':,.?]).{8,}$";
/**
* 密碼復(fù)雜度校驗(yàn)
* @param password 密碼
* @return 校驗(yàn)密碼強(qiáng)度是否合格 true/false
*/
public static boolean isStrongPassword(String password) {
if (StringUtils.isBlank(password)) {
return false;
}
return password.matches(PWD_REGEX);
}
}
方式2:密碼強(qiáng)度校驗(yàn)工具類
- 工具類
public class CheckPwdUtil {
private CheckPwdUtil(){}
/**
* 密碼等級枚舉
* 這里可以根據(jù)實(shí)際業(yè)務(wù)需求,擴(kuò)展更多等級
* 例如:EASY, MIDIUM, STRONG, VERY_STRONG等
*/
public enum PASSWD_LEVEL {
EASY, STRONG
}
/**
* NUM 數(shù)字
* SMALL_LETTER 小寫字母
* CAPITAL_LETTER 大寫字母
* OTHER_CHAR 特殊字符
*/
private static final int NUM = 1;
private static final int SMALL_LETTER = 2;
private static final int CAPITAL_LETTER = 3;
private static final int OTHER_CHAR = 4;
/**
* 獲得密碼強(qiáng)度等級,包括EASY、STRONG
* @param passwd 密碼
* @return 密碼等級枚舉
*/
public static PASSWD_LEVEL getPasswordLevel(String passwd) {
int level = check(passwd);
/**
* 這里可以根據(jù)業(yè)務(wù)需求,判斷不同的level來區(qū)分多級密碼強(qiáng)度
* 例如:
* level <= 2 為EASY
* 2 < level < 5 為MIDIUM
* level > 5 為STRONG
* level > 5 為VERY_STRONG
*/
if (level < 5) {
return CheckPwdUtil.PASSWD_LEVEL.EASY;
} else {
return CheckPwdUtil.PASSWD_LEVEL.STRONG;
}
}
/**
* 檢查密碼的強(qiáng)度
*
* @param passwd 密碼
* @return 密碼等級
*/
private static int check(String passwd) {
if (null == passwd) {
throw new IllegalArgumentException("密碼為空");
}
int level = 0;
// 增加點(diǎn)
//判斷密碼長度是否大于等于8 是level++
int len = passwd.length();
if (len >= 8) {
level++;
}
//判斷密碼是否含有數(shù)字 有l(wèi)evel++
if (countLetter(passwd, NUM) > 0) {
level++;
}
//判斷密碼是否含有小寫字母 有l(wèi)evel++
if (countLetter(passwd, SMALL_LETTER) > 0) {
level++;
}
//判斷密碼是否還有大寫字母 有l(wèi)evel++
if (countLetter(passwd, CAPITAL_LETTER) > 0) {
level++;
}
//判斷密碼是否還有特殊字符 有l(wèi)evel++
if (countLetter(passwd, OTHER_CHAR) > 0) {
level++;
}
return level;
}
/**
* 計(jì)算密碼中指定字符類型的數(shù)量
*
* @param passwd 密碼
* @param type 類型
* @return 數(shù)量
*/
private static int countLetter(String passwd, int type) {
int count = 0;
if (null != passwd && !passwd.isEmpty()) {
for (char c : passwd.toCharArray()) {
if (checkCharacterType(c) == type) {
count++;
}
}
}
return count;
}
/**
*檢查字符類型,包括num、大寫字母、小寫字母和其他字符。
*
* @param c – 字符
* @return 類型
*/
private static int checkCharacterType(char c) {
if (c >= 48 && c <= 57) {
return NUM;
}
if (c >= 65 && c <= 90) {
return CAPITAL_LETTER;
}
if (c >= 97 && c <= 122) {
return SMALL_LETTER;
}
return OTHER_CHAR;
}
}
- 使用
/**
* 賬號注冊
*
* @param param 注冊賬號信息
* @return 接口統(tǒng)一返回
*/
public Result signIn(Param param) {
// 其他邏輯
......
if (CheckPwdUtil.PASSWD_LEVEL.EASY.equals(CheckPwdUtil.getPasswordLevel(param.getPassword()))) {
return new Err<>("密碼必須包含大寫字母、小寫字母、數(shù)字和特殊字符,且長度是8位以上");
}
// 其他邏輯
......
}
以上兩種方式都可實(shí)現(xiàn)密碼強(qiáng)度校驗(yàn),可根據(jù)自身業(yè)務(wù)需要選擇使用。
到此這篇關(guān)于Java實(shí)現(xiàn)登錄密碼強(qiáng)度校驗(yàn)的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)Java 登錄密碼強(qiáng)度校驗(yàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot接收POST請求,數(shù)據(jù)為json類型問題
在使用Spring框架中,當(dāng)處理POST請求且內(nèi)容為JSON類型時(shí),應(yīng)使用@RequestBody注解而非@RequestParam,通過@RequestBody可以將JSON數(shù)據(jù)綁定到一個(gè)Map對象中,然后通過Map的get方法來獲取需要的參數(shù)2022-10-10
Spring框架通過工廠創(chuàng)建Bean的三種方式實(shí)現(xiàn)
這篇文章主要介紹了Spring框架通過工廠創(chuàng)建Bean的三種方式實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Springboot整合mybatisplus時(shí),使用條件構(gòu)造器排序報(bào)錯問題及解決
這篇文章主要介紹了Springboot整合mybatisplus時(shí),使用條件構(gòu)造器排序報(bào)錯問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
Java中Map和Set練習(xí)項(xiàng)目實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Java中Map和Set練習(xí)項(xiàng)目的相關(guān)資料,首先介紹了如何使用map來統(tǒng)計(jì)字符串?dāng)?shù)組中每個(gè)字符串的出現(xiàn)次數(shù),然后討論了如何使用set來找出只出現(xiàn)一次的數(shù)字,最后提出了一個(gè)解決壞鍵盤打字問題的思路,需要的朋友可以參考下2024-11-11
springboot集成websocket的四種方式小結(jié)
本文主要介紹了springboot集成websocket的四種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
async-excel實(shí)現(xiàn)多sheet異步導(dǎo)出方法詳解
這篇文章主要介紹了async-excel實(shí)現(xiàn)多sheet異步導(dǎo)出方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12
SpringBoot實(shí)現(xiàn)elasticsearch索引操作的代碼示例
這篇文章主要給大家介紹了SpringBoot如何實(shí)現(xiàn)elasticsearch 索引操作,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以參考閱讀下2023-07-07

