JAVA强密码校验算法示例代码
作者:奋力向前123
最近系统需要做用户密码升级,增加强密码校验,密码长度,复杂度等等,这篇文章主要介绍了JAVA强密码校验算法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
一、需求
(1)禁止使用连续的三个数字或键盘连续的三个字母作为密码的组成部分,如asdf@123、abcd@1234 、qaz@wsx等; (2)禁止使用系统账号、姓名、出生日期的作为密码的组成部分,如:zhangsan@123、admin@123、Ctg@2021; (3)避免使用字典口令,包括许多大家习惯性设置的口令,比如常见的字典口令: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 {
// 禁止使用的系统账号、常见姓名和字典口令
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"
};
// 检查密码是否包含连续的三个数字或键盘连续的三个字母
public static boolean containsKeyboardSequence(String password) {
password = password.toLowerCase();
// 检查连续三个数字
if (Pattern.compile("\\d{3}").matcher(password).find()) {
return true;
}
// 检查键盘连续三个键
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;
}
// 综合验证密码
public static Map<String,Object> validatePassword(String password) {
Map<String,Object> map = new HashMap<String,Object>();
if (password == null || password.length() < 8) {
log.info("密码长度至少8位");
map.put("boolean", false);
map.put("msg", "密码长度至少8位");
return map;
}
if (containsKeyboardSequence(password)) {
log.info("密码不能包含连续的三个数字或键盘连续的三个字母");
map.put("boolean", false);
map.put("msg", "密码不能包含连续的三个数字或键盘连续的三个字母");
return map;
}
if (containsForbiddenWords(password)) {
log.info("密码不能包含系统账号、常见姓名或字典口令");
map.put("boolean", false);
map.put("msg", "密码不能包含系统账号、常见姓名或字典口令");
return map;
}
// 检查密码复杂度
if (!Pattern.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$").matcher(password).matches()) {
log.info("密码必须包含大小写字母、数字和特殊字符");
map.put("boolean", false);
map.put("msg", "密码必须包含大小写字母、数字和特殊字符");
return map;
}
map.put("boolean", true);
map.put("msg", "密码符合规则");
return map;
}
public static void main(String[] args) {
// 验证密码
Map<String,Object> isValid = new PasswordValidatorUtils().validatePassword("ctgssw0rd");
// 返回true表示密码符合要求,false表示不符合
}
}总结
到此这篇关于JAVA强密码校验算法的文章就介绍到这了,更多相关Java强密码校验算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
