Java實(shí)現(xiàn)登錄密碼強(qiáng)度校驗(yàn)的項(xiàng)目實(shí)踐
方式1:使用正則表達(dá)式匹配校驗(yàn)
- 不同規(guī)則表達(dá)式
- 密碼必須包含大寫、小寫、數(shù)字和特殊字符,且長(zhǎng)度是8位以上
private static final String PWD_REGEX = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*()=_+;':,.?]).{8,}$";
- 密碼必須包含大寫、小寫、數(shù)字和特殊字符,且長(zhǎng)度是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ù)字和特殊字符,且長(zhǎng)度是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í)枚舉 * 這里可以根據(jù)實(shí)際業(yè)務(wù)需求,擴(kuò)展更多等級(jí) * 例如: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)度等級(jí),包括EASY、STRONG * @param passwd 密碼 * @return 密碼等級(jí)枚舉 */ public static PASSWD_LEVEL getPasswordLevel(String passwd) { int level = check(passwd); /** * 這里可以根據(jù)業(yè)務(wù)需求,判斷不同的level來區(qū)分多級(jí)密碼強(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 密碼等級(jí) */ private static int check(String passwd) { if (null == passwd) { throw new IllegalArgumentException("密碼為空"); } int level = 0; // 增加點(diǎn) //判斷密碼長(zhǎng)度是否大于等于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; } }
- 使用
/** * 賬號(hào)注冊(cè) * * @param param 注冊(cè)賬號(hào)信息 * @return 接口統(tǒng)一返回 */ public Result signIn(Param param) { // 其他邏輯 ...... if (CheckPwdUtil.PASSWD_LEVEL.EASY.equals(CheckPwdUtil.getPasswordLevel(param.getPassword()))) { return new Err<>("密碼必須包含大寫字母、小寫字母、數(shù)字和特殊字符,且長(zhǎng)度是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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot接收POST請(qǐng)求,數(shù)據(jù)為json類型問題
在使用Spring框架中,當(dāng)處理POST請(qǐng)求且內(nèi)容為JSON類型時(shí),應(yīng)使用@RequestBody注解而非@RequestParam,通過@RequestBody可以將JSON數(shù)據(jù)綁定到一個(gè)Map對(duì)象中,然后通過Map的get方法來獲取需要的參數(shù)2022-10-10使用jpa之動(dòng)態(tài)插入與修改(重寫save)
這篇文章主要介紹了使用jpa之動(dòng)態(tài)插入與修改(重寫save),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Spring框架通過工廠創(chuàng)建Bean的三種方式實(shí)現(xiàn)
這篇文章主要介紹了Spring框架通過工廠創(chuàng)建Bean的三種方式實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Springboot整合mybatisplus時(shí),使用條件構(gòu)造器排序報(bào)錯(cuò)問題及解決
這篇文章主要介紹了Springboot整合mybatisplus時(shí),使用條件構(gòu)造器排序報(bào)錯(cuò)問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04Java中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-11springboot集成websocket的四種方式小結(jié)
本文主要介紹了springboot集成websocket的四種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12async-excel實(shí)現(xiàn)多sheet異步導(dǎo)出方法詳解
這篇文章主要介紹了async-excel實(shí)現(xiàn)多sheet異步導(dǎo)出方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12SpringBoot實(shí)現(xiàn)elasticsearch索引操作的代碼示例
這篇文章主要給大家介紹了SpringBoot如何實(shí)現(xiàn)elasticsearch 索引操作,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以參考閱讀下2023-07-07