密码验证连续多位相同或者顺序字符引发的思考.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,虽然是有限的枚举,先不说好不好,自己写起来就很烦。
作文最后一句,喊口号:多思考,多尝试,多总结 。
期待你更好的实现分享
参考
- ASCII 码对照表:http://tool.oschina.net/commons?type=4
- ASCII (包括 Java 中 2 种表示 ASCII 的方式):https://blog.csdn.net/chy555chy/article/details/51938914
上一篇: 2008年该如何投资中文域名?
下一篇: 怎么批量拒绝网站的垃圾外链?