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强密码校验算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Springboot 如何指定获取出 yml文件里面的配置值
这篇文章主要介绍了Springboot 如何指定获取出 yml文件里面的配置值操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07
如何在Spring Boot应用中优雅的使用Date和LocalDateTime的教程详解
这篇文章主要介绍了如何在Spring Boot应用中优雅的使用Date和LocalDateTime,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-07-07
Servlet+MyBatis项目转Spring Cloud微服务,多数据源配置修改建议
今天小编就为大家分享一篇关于Servlet+MyBatis项目转Spring Cloud微服务,多数据源配置修改建议,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-01-01
SpringBoot @Async如何自定义线程池及使用教程
这篇文章主要介绍了SpringBoot @Async如何自定义线程池及使用教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2024-01-01
MyBatis注解开发-@Insert和@InsertProvider的使用
这篇文章主要介绍了MyBatis注解开发-@Insert和@InsertProvider的使用,具有很好的参考价值,希望对大家有所帮助。2022-07-07


最新评论