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

需求

虽然用户对于这种复杂的密码验证恨之入骨,但是有时出于安全的考虑,我们系统不得不强制要求用户设置更高强度的密码。

如:不能连续出现多位相同或者连续的字符。


思考

对于常规的验证,我们通常使用正则表达式,所以我一开始也从这方面入手,但始终没有一个实现的思路。

后来看到有人用字符数组,通过下标判断是否连续,再加上偶然看到有人在讨论 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,虽然是有限的枚举,先不说好不好,自己写起来就很烦。

作文最后一句,喊口号:多思考,多尝试,多总结 。

期待你更好的实现分享

参考

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

  1. js验证连续两位数字递增或递减和连续三位数字相同

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  2. java密码验证正则表达式校验

    ,正则表达式就是记录文本规则的代码.php密码验证正则表达式(8位长度限制)<?php //密码验证 $password = "zongzi_Abc_oo13a2"; $n ...

  3. JS密码校验规则前台验证(不能连续字符(如123、abc)连续3位或3位以上)(不能相同字符(如111、aaa)连续3位或3位以上)

    密码必须为8到16位且必须包含数字和字母 密码必须包含特殊字符[_&#%] 不能连续字符(如123.abc)连续3位或3位以上 不能相同字符(如111.aaa)连续3位或3位以上 /** * ...

  4. 【WCF】Silverlight+wcf+自定义用户名密码验证

    本文摘自 http://www.cnblogs.com/virusswb/archive/2010/01/26/1656543.html 在昨天的博文Silverlight3+wcf+在不使用证书的情 ...

  5. VUE 密码验证与提示

    1. 概述 1.1 说明 vue项目中,为了较为明了的让用户看到所输入的密码信息的长度与复杂度是否满足要求,开发一个组件来满足此需求(当密码输入时进行密码验证操作,当密码的长度在8到24位之间,密码中 ...

  6. [c/c++] programming之路(24)、字符串(五)——字符串插入,字符串转整数,删除字符,密码验证,注意事项

    1.将字符串插入到某位置(原字符串“hello yincheng hello cpp hello linux”,查找cpp,找到后在cpp的后面插入字符串“hello c”) 需要用到strstr字符 ...

  7. 第一百五十节,封装库--JavaScript,表单验证--密码验证

    封装库--JavaScript,表单验证--密码验证 效果图 html <div id="reg"> <h2 class="tuo">& ...

  8. php实现 密码验证合格程序(复杂问题分类,超简单的)(分类+规范编码)

    php实现 密码验证合格程序(复杂问题分类,超简单的)(分类+规范编码) 一.总结 一句话总结:复杂问题分类,超简单的.分类+规范编码. 1.写的时候判断  不能有相同长度超2的子串重复  的时候,子 ...

  9. Oracle密码验证函数与Create Profile

    今天看到了一个oracle密码函数的东西,就在网上找文档自己做测试,刚开始看不懂,最后做完记录一下 密码函数的作用就是要将用户密码进行限制,比如申请一个网站的账号的时候,密码会要求你不少于8位,必须要 ...

随机推荐

  1. Inno Setup 打包的文件以管理员权限执行

    最近发现一个问题,就是Inno Setup打包的程序安装完毕后执行需求管理员权限的程序的时候会失败( inno createprocess   须要提升),解决问题的最简单办法就是打包的后的程序也以管 ...

  2. 问题解决: Pandas and scikit-learn: KeyError: […] not in index

    https://stackoverflow.com/questions/51091132/pandas-and-scikit-learn-keyerror-not-in-index The probl ...

  3. MySQL怎样存储IP地址

    为什么要问如何存储IP 首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗? 其实做任何程序设计都要在功能实现的基础上最大限度的优化性能.而数据库设计是程序设计中不 ...

  4. MongoDB GridFS最佳应用概述

    <MongoDB GridFS最佳应用概述> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs GridFS是MongoDB数据库之上的一个简单 ...

  5. 优化数据页面(22)——n:n的数据关系

    设计要点:优化数据页面.界面设计.美化exce 阿金:那n::n就复杂了,你倒是想留有空间. 可是现实社会有时却不同意. 秀秀:唉.说的也是. 阿金:那怎么表达才合适啊? 秀秀:仅仅实用网格了. 阿金 ...

  6. God web

    http://my.csdn.net/yerenyuan_pku http://evilcos.me/?p=336 https://www.zhihu.com/question/21606800 st ...

  7. 2.Stacks(堆栈)

    一.概述 C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,也就是说实现了一个先进后出(FILO)的数据结构. 二.常用API empty() 堆栈为空则返回真 pop() ...

  8. C#遍历计算机上所有的文件

    class Program { static List<string> allFileName=new List<string>(); static void Main(str ...

  9. Greatest Number 山东省第一届省赛

    Greatest Number Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Saya likes math, because ...

  10. windows共享文件的方法

    众所周知,一个宿舍,一个公司处在一个局域网络中,在不能使用外网通信情况下,此时,我们忘带U盘或者硬盘,同学或同事之间需要拷贝资料或者数据,是不是就不能实现了呢?答案是否定的.微软为了解决这种不必要的麻 ...