JAVA強(qiáng)密碼校驗(yàn)算法示例代碼
一、需求
(1)禁止使用連續(xù)的三個(gè)數(shù)字或鍵盤連續(xù)的三個(gè)字母作為密碼的組成部分,如asdf@123、abcd@1234 、qaz@wsx等; (2)禁止使用系統(tǒng)賬號(hào)、姓名、出生日期的作為密碼的組成部分,如:zhangsan@123、admin@123、Ctg@2021; (3)避免使用字典口令,包括許多大家習(xí)慣性設(shè)置的口令,比如常見(jiàn)的字典口令:Qaz@wsx、Admin123、hkcts@123、Ctg12345等
二、算法:
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import lombok.extern.slf4j.Slf4j;
/**
*
*/
@Slf4j
public class PasswordValidatorUtils {
// 禁止使用的系統(tǒng)賬號(hào)、常見(jiàn)姓名和字典口令
private static final Set<String> FORBIDDEN_WORDS = new HashSet<>(Arrays.asList(
"admin", "root", "system", "user", "password",
"zhangsan", "lisi", "wangwu", "qaz", "wsx",
"qwerty", "asdf", "zxcv", "12345", "admin123",
"hkcts", "ctg"
));
// 鍵盤上相鄰的鍵位組合(QWERTY鍵盤布局)
private static final String[] KEYBOARD_SEQUENCES = {
"qwertyuiop", "asdfghjkl", "zxcvbnm",
"1234567890", "1qaz", "2wsx", "3edc", "4rfv", "5tgb", "6yhn", "7ujm", "8ik", "9ol", "0p",
"qaz", "wsx", "edc", "rfv", "tgb", "yhn", "ujm", "ik", "ol", "p"
};
// 檢查密碼是否包含連續(xù)的三個(gè)數(shù)字或鍵盤連續(xù)的三個(gè)字母
public static boolean containsKeyboardSequence(String password) {
password = password.toLowerCase();
// 檢查連續(xù)三個(gè)數(shù)字
if (Pattern.compile("\\d{3}").matcher(password).find()) {
return true;
}
// 檢查鍵盤連續(xù)三個(gè)鍵
for (String sequence : KEYBOARD_SEQUENCES) {
for (int i = 0; i <= sequence.length() - 3; i++) {
String subSeq = sequence.substring(i, i + 3);
if (password.contains(subSeq)) {
return true;
}
// 反向檢查
String reverseSubSeq = new StringBuilder(subSeq).reverse().toString();
if (password.contains(reverseSubSeq)) {
return true;
}
}
}
return false;
}
// 檢查密碼是否包含禁止的詞匯
public static boolean containsForbiddenWords(String password) {
String lowerPwd = password.toLowerCase();
for (String word : FORBIDDEN_WORDS) {
if (lowerPwd.contains(word)) {
return true;
}
}
return false;
}
// 綜合驗(yàn)證密碼
public static Map<String,Object> validatePassword(String password) {
Map<String,Object> map = new HashMap<String,Object>();
if (password == null || password.length() < 8) {
log.info("密碼長(zhǎng)度至少8位");
map.put("boolean", false);
map.put("msg", "密碼長(zhǎng)度至少8位");
return map;
}
if (containsKeyboardSequence(password)) {
log.info("密碼不能包含連續(xù)的三個(gè)數(shù)字或鍵盤連續(xù)的三個(gè)字母");
map.put("boolean", false);
map.put("msg", "密碼不能包含連續(xù)的三個(gè)數(shù)字或鍵盤連續(xù)的三個(gè)字母");
return map;
}
if (containsForbiddenWords(password)) {
log.info("密碼不能包含系統(tǒng)賬號(hào)、常見(jiàn)姓名或字典口令");
map.put("boolean", false);
map.put("msg", "密碼不能包含系統(tǒng)賬號(hào)、常見(jiàn)姓名或字典口令");
return map;
}
// 檢查密碼復(fù)雜度
if (!Pattern.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$").matcher(password).matches()) {
log.info("密碼必須包含大小寫字母、數(shù)字和特殊字符");
map.put("boolean", false);
map.put("msg", "密碼必須包含大小寫字母、數(shù)字和特殊字符");
return map;
}
map.put("boolean", true);
map.put("msg", "密碼符合規(guī)則");
return map;
}
public static void main(String[] args) {
// 驗(yàn)證密碼
Map<String,Object> isValid = new PasswordValidatorUtils().validatePassword("ctgssw0rd");
// 返回true表示密碼符合要求,false表示不符合
}
}總結(jié)
到此這篇關(guān)于JAVA強(qiáng)密碼校驗(yàn)算法的文章就介紹到這了,更多相關(guān)Java強(qiáng)密碼校驗(yàn)算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 生產(chǎn)者/消費(fèi)者問(wèn)題實(shí)例詳解
這篇文章主要實(shí)例分析了java中生產(chǎn)者消費(fèi)者問(wèn)題的方法,需要的朋友可以可以參考下2017-04-04
Java的非阻塞隊(duì)列ConcurrentLinkedQueue解讀
這篇文章主要介紹了Java的非阻塞隊(duì)列ConcurrentLinkedQueue解讀,在并發(fā)編程中,有時(shí)候需要使用線程安全的隊(duì)列,如果要實(shí)現(xiàn)一個(gè)線程安全的隊(duì)列有兩種方式:一種是使用阻塞算法,另一種是使用非阻塞算法,需要的朋友可以參考下2023-12-12
10個(gè)實(shí)現(xiàn)Java集合,Map類型自由轉(zhuǎn)換的實(shí)用工具方法
這篇文章主要為大家整理了整理了10個(gè)實(shí)用工具方法,可以滿足?Collection、List、Set、Map?之間各種類型轉(zhuǎn)化,文中的示例代碼講解詳細(xì),需要的可以參考下2023-09-09
Java中string和int的互相轉(zhuǎn)換問(wèn)題
本文通過(guò)實(shí)例代碼給大家詳細(xì)介紹了Java中string和int的互相轉(zhuǎn)換問(wèn)題,感興趣的朋友一起看看吧2017-10-10
Spring Boot系列教程之7步集成RabbitMQ的方法
RabbitMQ 即一個(gè)消息隊(duì)列,主要是用來(lái)實(shí)現(xiàn)應(yīng)用程序的異步和解耦,同時(shí)也能起到消息緩沖,消息分發(fā)的作用。下面這篇文章主要給大家介紹了關(guān)于Spring Boot之7步集成RabbitMQ的相關(guān)資料,需要的朋友可以參考下2018-11-11
Hibernate實(shí)現(xiàn)many-to-many的映射關(guān)系
今天小編就為大家分享一篇關(guān)于Hibernate實(shí)現(xiàn)many-to-many的映射關(guān)系,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
關(guān)于Gateway網(wǎng)關(guān)中配置跨域的三種方案
文章總結(jié):介紹了三種處理跨域請(qǐng)求的方法:在Controller類上添加注解、通過(guò)配置類實(shí)現(xiàn)重寫WebMvcConfigurer接口和在配置文件中統(tǒng)一設(shè)置,希望這些方法能幫助讀者解決跨域問(wèn)題2024-11-11

