java正則表達(dá)式判斷強(qiáng)密碼和隨機(jī)生成強(qiáng)密碼代碼示例
前言
項(xiàng)目中遇到需要判斷管理員登陸密碼為強(qiáng)密碼,同時(shí)可以自動(dòng)隨機(jī)生成強(qiáng)密碼,寫了一個(gè)函數(shù)。
一、定義幾個(gè)常量
// 先把需要驗(yàn)證的規(guī)則放入一個(gè)字符數(shù)組中 private static final char[] CHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890@#$%^&+=" .toCharArray(); //定義正則表達(dá)式規(guī)則至少要一個(gè)大寫字母一個(gè)小寫字母一個(gè)特殊字符,密碼長度在8~16位之間 private static final String PASSWORD_REGEX = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]){1,2}+(?=\\S+$).{8,16}$"; //判斷密碼中是否有中文 private static final String NO_CHINESE_REGEX = "^[^\\u4e00-\\u9fa5]+$"; //根據(jù)上面兩個(gè)規(guī)則創(chuàng)建兩個(gè)模式用于校驗(yàn) private static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_REGEX); private static final Pattern NO_CHINESE_PATTERN = Pattern.compile(NO_CHINESE_REGEX);
二、生成強(qiáng)密碼
/** * 隨機(jī)生成強(qiáng)密碼 * @param length 密碼長度 * @return password */ public static String generatePassword(int length) { //判斷密碼是否在8~16位之間超出或小于都會(huì)設(shè)置默認(rèn)長度 length = length < 8 ? 8 : length; length = length > 16 ? 16 : length; //調(diào)用獲取隨機(jī)強(qiáng)密碼函數(shù) String result = getRandomPassword(length); // 如果規(guī)則滿足條件直接返回強(qiáng)密碼,否則再次調(diào)用 Matcher m = PASSWORD_PATTERN.matcher(result); Matcher m1 = NO_CHINESE_PATTERN.matcher(result); if (m.matches() && m1.matches()) { return result; } return generatePassword(length); } //隨機(jī)生成強(qiáng)密碼 private static String getRandomPassword(int length) { StringBuilder sb = new StringBuilder(); //線程安全隨機(jī)數(shù) ThreadLocalRandom r = ThreadLocalRandom.current(); for (int x = 0; x < length; ++x) { //添加CHAR里面的隨機(jī)下標(biāo) sb.append(CHAR[r.nextInt(CHAR.length)]); } return sb.toString(); }
三.校驗(yàn)密碼強(qiáng)度
/** * 校驗(yàn)密碼復(fù)雜度,至少包含8個(gè)字符,最多包含20個(gè)自負(fù) * 至少包含一個(gè)數(shù)字,一個(gè)大寫字母,一個(gè)小寫字母,一個(gè)特殊字符,同時(shí)不能包含空白區(qū)域 * @param password 密碼 * @return true/false */ public static boolean checkPasswordComplexity(String password) { if(StringUtils.isBlank(password)){ return false; } if (password.length()> 8 && password.length() < 16) { //密碼至少包含:大小寫英文字母、數(shù)字、特殊符號,密碼長度大于8位,小于16位 String regex = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,16}$"; // 判斷密碼是否匹配規(guī)則 return Pattern.matches(regex, password); } else { return false; } }
總結(jié)
以上就是java如何使用正則表達(dá)式判斷是否為強(qiáng)密碼和如何隨機(jī)生成強(qiáng)密碼。
到此這篇關(guān)于java正則表達(dá)式判斷強(qiáng)密碼和隨機(jī)生成強(qiáng)密碼的文章就介紹到這了,更多相關(guān)java正則判斷強(qiáng)密碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot?@InitBinder注解綁定請求參數(shù)的過程詳解
這篇文章主要介紹了SpringBoot?@InitBinder注解綁定請求參數(shù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04淺談@FeignClient中name和value屬性的區(qū)別
這篇文章主要介紹了@FeignClient中name和value屬性的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07spring中@ComponentScan自動(dòng)掃描并指定掃描規(guī)則
本文主要介紹了spring中@ComponentScan自動(dòng)掃描并指定掃描規(guī)則,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Java從內(nèi)存角度帶你理解數(shù)組名實(shí)質(zhì)是個(gè)地址的論述
這篇文章主要介紹了Java如何從內(nèi)存解析的角度理解“數(shù)組名實(shí)質(zhì)是一個(gè)地址”,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09springboot Quartz動(dòng)態(tài)修改cron表達(dá)式的方法
這篇文章主要介紹了springboot Quartz動(dòng)態(tài)修改cron表達(dá)式的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09java實(shí)現(xiàn)計(jì)算周期性提醒的示例
本文分享一個(gè)java實(shí)現(xiàn)計(jì)算周期性提醒的示例,可以計(jì)算父親節(jié)、母親節(jié)這樣的節(jié)日,也可以定義如每月最好一個(gè)周五,以方便安排會(huì)議2014-04-04Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之隊(duì)列
這篇文章主要介紹了Java隊(duì)列數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),隊(duì)列是一種特殊的線性表,只允許在表的隊(duì)頭進(jìn)行刪除操作,在表的后端進(jìn)行插入操作,隊(duì)列是一個(gè)有序表先進(jìn)先出,想了解更多相關(guān)資料的小伙伴可以參考下面文章的詳細(xì)內(nèi)容2022-02-02