密码验证连续多位相同或者顺序字符引发的思考.md
密码验证连续多位相同或者顺序字符引发的思考
需求
虽然用户对于这种复杂的密码验证恨之入骨,但是有时出于安全的考虑,我们系统不得不强制要求用户设置更高强度的密码。
如:不能连续出现多位相同或者连续的字符。
思考
对于常规的验证,我们通常使用正则表达式,所以我一开始也从这方面入手,但始终没有一个实现的思路。
后来看到有人用字符数组,通过下标判断是否连续,再加上偶然看到有人在讨论 ASCII 码,灵机一动,结合这两者就是一个很好的实现。
实现
简单实现,如下所示:
import static org.junit.Assert.*;
import org.junit.Test;
public class MainTest {
@Test
public void test() {
String password = "abcdd";
boolean isRepeat = isRepeatChar(password, 1);
boolean isOrder = isOrderChar(password, 3);
assertEquals(true, isRepeat);
assertEquals(true, isOrder);
}
/**
* 是否存在连续 i 位顺序字符
* @param str
* @param i 存在 i 位顺序字符,i 应大于等于1
* @return 如果 i 位顺序的字符,则返回 true,否则返回 false
*/
private boolean isOrderChar(String str, int i) {
char[] charArr = str.toCharArray();
int len = charArr.length;
int count = 0;
int t = charArr[0];
for (int j = 1; j < len; j++) {
if ((t + 1) == charArr[j]) {
count ++;
if (count == i) {
return true;
}
} else {
count = 0;
}
t = charArr[j];
}
return false;
}
/**
* 字符串中是否至少包含 i 位重复相同的字符
* @param str
* @param i i位重复数字,i 应大于等于1
* @return 如果包含 i 位重复相同的字符,则返回 true,否则返回 false
*/
private boolean isRepeatChar(String str, int i) {
char[] charArr = str.toCharArray();
int len = charArr.length;
int count = 0;
int t = charArr[0];
for (int j = 1; j < len; j++) {
if (t == charArr[j]) {
count ++;
if (count == i) {
return true;
}
} else {
t = charArr[j];
count = 0;
}
}
return false;
}
}
总结
实现是很简单的,但是如果执着在正则表达式,可能再尝试很久都做不出来,而且明显增加难度,也不是一个好的实现方式。
字符数组下标的实现方式,对于 1-9,a-z,A-Z,虽然是有限的枚举,先不说好不好,自己写起来就很烦。
作文最后一句,喊口号:多思考,多尝试,多总结 。
期待你更好的实现分享
参考
- ASCII 码对照表:http://tool.oschina.net/commons?type=4
- ASCII (包括 Java 中 2 种表示 ASCII 的方式):https://blog.csdn.net/chy555chy/article/details/51938914
一分耕耘一分收获