问题描述
编写一个函数,该函数接受一个字符串作为参数,检查该字符串是否符合密码强度要求, 返回True或False。
要求
密码强度要求如下:
- 不能小于6个字符
- 必须出现大写、小写、数字、特殊字符(!@#$%^&*_-) 的组合
- 不能出现4个连续的字符,比如1234, dcba这样的规则
建议使用正则表达式来实现密码强度检查。
测试代码
assert is_password_strong('A1b@131') == True # 符合所有条件
assert is_password_strong('abc123') == False # 缺少大写字母和特殊字符
assert is_password_strong('ABC!123') == False # 缺少小写字母
assert is_password_strong('aBc!123') == True # 符合所有条件
assert is_password_strong('') == False # 空字符串
assert is_password_strong('A') == False # 长度不足
assert is_password_strong('Ab@1234') == False # 不能顺序字符
assert is_password_strong('Ab@6543X') == False # 不能顺序字符
assert is_password_strong('Ab@abcdf') == False # 不能顺序字符
assert is_password_strong('Ab1@1212') == True # 避免Abs出现1212都是连续1的情况
解决思路
- 使用正则表达式:正则表达式是一种强大的字符串匹配工具,可以用来检查字符串是否符合特定的模式。我们可以使用正则表达式来检查密码是否符合要求。
- 循环检查:我们可以每个条件单独检查,比如检查密码长度、是否包含大写字母、小写字母、数字和特殊字符等。
- 避免连续字符:顺序的字符可以通过判断ascii码的差值来实现,如果差值连续为1/-1,则表示连续字符。
代码实现
static Pattern upperCaseLetter = Pattern.compile("[A-Z]");
static Pattern lowerCaseLetter = Pattern.compile("[a-z]");
static Pattern digit = Pattern.compile("[0-9]");
static Pattern specialChars = Pattern.compile("[!@#$%^&*_-]");
public static boolean checkPasswordStrength(String password) {
if (password.length() < 6) {
return false;
}
if (!upperCaseLetter.matcher(password).find() ||
!lowerCaseLetter.matcher(password).find() ||
!digit.matcher(password).find() ||
!specialChars.matcher(password).find()) {
return false;
}
int count = 1;
int prevDiff = 0;
for (int i = 0; i < password.length() - 1; i++) {
char c = password.charAt(i);
int diff = c - password.charAt(i + 1);
if (Math.abs(diff) == 1 && (prevDiff == 0 || prevDiff == diff) && Character.isLetterOrDigit(c)) {
count++;
prevDiff = diff;
} else if (count < 4) {
count = 1;
prevDiff = 0;
} else {
break;
}
}
return count < 4;
}
代码通过生成了4个正则表达式来检查密码是否符合要求,然后遍历密码,检查是否有连续字符,最后返回检查结果。 变量密码是否连续字符的检查,通过比较ascii码的差值来实现, 必须是连续的1或者-1,否则就不是连续字符。
通过count记录连续的字符个数,如果连续字符个数大于等于4,则返回False。
性能优化小技巧
- 正则表达式需要编译的时间,如果需要频繁使用,可以用静态变量来存储编译好的正则表达式,减少编译时间
- 多个规则的判断可以合并到一个正则表达式中,减少判断次数
- 多个规则用||的方式判断,如果前面的规则不符合,后面的规则就不需要判断了,这样减少了判断次数
这里有完整的代码:
总结
所有的后端工程师都应该有最基本的安全意识,要求用户设置强密码是保护用户数据的第一步。
这个简单的密码强度检查器可以帮助你检查用户设置的密码是否符合基本的安全标准,保护用户的数据安全。
你可以通过这个简单的实现来学习正则表达式的使用,以及如何检查密码的强度。如果你想进一步提高密码强度检查的功能,可以考虋增加更多的检查条件,比如密码是否包含用户名、是否包含常见的密码等。
所有的后端面试常见的问题,我们每天都会在我们的编程群里面讨论和Code review, 欢迎大家加入我们的编程群,一起学习和进步。
欢迎大家关注 入职啦 (公众号: ruzhila) ,获取更多有趣的编程挑战题和技术干货!