欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

密码验证连续多位相同或者顺序字符引发的思考.md

程序员文章站 2022-05-12 22:41:29
密码验证连续多位相同或者顺序字符引发的思考 [TOC] 需求 虽然用户对于这种复杂的密码验证恨之入骨,但是有时出于安全的考虑,我们系统不得不强制要求用户设置更高强度的密码。 如:不能连续出现多位相同或者连续的字符。 思考 对于常规的验证,我们通常使用正则表达式,所以我一开始也从这方面入手,但始终没有 ......

密码验证连续多位相同或者顺序字符引发的思考

[TOC]

需求

虽然用户对于这种复杂的密码验证恨之入骨,但是有时出于安全的考虑,我们系统不得不强制要求用户设置更高强度的密码。
如:不能连续出现多位相同或者连续的字符。


思考

对于常规的验证,我们通常使用正则表达式,所以我一开始也从这方面入手,但始终没有一个实现的思路。
后来看到有人用字符数组,通过下标判断是否连续,再加上偶然看到有人在讨论 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,虽然是有限的枚举,先不说好不好,自己写起来就很烦。
作文最后一句,喊口号:多思考,多尝试,多总结 。

期待你更好的实现分享

参考