密码验证连续多位相同或者顺序字符引发的思考.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,虽然是有限的枚举,先不说好不好,自己写起来就很烦。
作文最后一句,喊口号:多思考,多尝试,多总结 。

期待你更好的实现分享

参考

原文地址:https://www.cnblogs.com/zhanyao/p/8983494.html