密码验证连续多位相同或者顺序字符引发的思考.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
密码验证连续多位相同或者顺序字符引发的思考.md的更多相关文章
- js验证连续两位数字递增或递减和连续三位数字相同
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- java密码验证正则表达式校验
,正则表达式就是记录文本规则的代码.php密码验证正则表达式(8位长度限制)<?php //密码验证 $password = "zongzi_Abc_oo13a2"; $n ...
- JS密码校验规则前台验证(不能连续字符(如123、abc)连续3位或3位以上)(不能相同字符(如111、aaa)连续3位或3位以上)
密码必须为8到16位且必须包含数字和字母 密码必须包含特殊字符[_&#%] 不能连续字符(如123.abc)连续3位或3位以上 不能相同字符(如111.aaa)连续3位或3位以上 /** * ...
- 【WCF】Silverlight+wcf+自定义用户名密码验证
本文摘自 http://www.cnblogs.com/virusswb/archive/2010/01/26/1656543.html 在昨天的博文Silverlight3+wcf+在不使用证书的情 ...
- VUE 密码验证与提示
1. 概述 1.1 说明 vue项目中,为了较为明了的让用户看到所输入的密码信息的长度与复杂度是否满足要求,开发一个组件来满足此需求(当密码输入时进行密码验证操作,当密码的长度在8到24位之间,密码中 ...
- [c/c++] programming之路(24)、字符串(五)——字符串插入,字符串转整数,删除字符,密码验证,注意事项
1.将字符串插入到某位置(原字符串“hello yincheng hello cpp hello linux”,查找cpp,找到后在cpp的后面插入字符串“hello c”) 需要用到strstr字符 ...
- 第一百五十节,封装库--JavaScript,表单验证--密码验证
封装库--JavaScript,表单验证--密码验证 效果图 html <div id="reg"> <h2 class="tuo">& ...
- php实现 密码验证合格程序(复杂问题分类,超简单的)(分类+规范编码)
php实现 密码验证合格程序(复杂问题分类,超简单的)(分类+规范编码) 一.总结 一句话总结:复杂问题分类,超简单的.分类+规范编码. 1.写的时候判断 不能有相同长度超2的子串重复 的时候,子 ...
- Oracle密码验证函数与Create Profile
今天看到了一个oracle密码函数的东西,就在网上找文档自己做测试,刚开始看不懂,最后做完记录一下 密码函数的作用就是要将用户密码进行限制,比如申请一个网站的账号的时候,密码会要求你不少于8位,必须要 ...
随机推荐
- 在云服务器上部署node.js服务器
本文档介绍腾讯云·万象优图服务端nodejs的部署和集成,搭建一个nodejs+nginx为基础,对web端或者移动端提供http签名接口服务的例子程序.注意:本文档只是简单的示例,展示了服务端为终端 ...
- PHP操作MongoDB数据库具体样例介绍(增、删、改、查) (六)
PHP操作mongodb: PHP 要操作mongodb须要打模块 官网能够下载:http://pecl.php.net/package/mongo 下载 mongodb设置成用户授权的启动方式 ph ...
- PowerShell---Operators 介绍
1.Arithmetic operators(算术运算符) 算术运算符包括加.减.乘.除.取模 此外,加法运算符 (+) 和乘法运算符 (*) 还可对字符串.数组和哈希表进行运算.加法运算符将输入连接 ...
- Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??
Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法?? 1 framework 4.5 (10万个api)1 2 Jdk8 57M1 3 Gi ...
- 分页技术框架(Pager-taglib)学习三(pager-taglib中传递参数时中文乱码问题)
一.问题描述 问题: 使用<pg:param name="key" />标签传递中文参数时,会有乱码. 原因: 因为它默认是用gb2312来对添加的参数进行编码,如果你 ...
- 日期在苹果手机上显示NaN的处理方法
注意两点即可: 1.苹果只认识 yyyy/mmmm/dddd/ 这类格式的日期 2.如果输出后还要进行处理日期对比,苹果默认会带中文字,如:年月日,需要转成上面1当中的日期格式在转时间戳进行比较 G ...
- datatables 相关文章
http://blog.csdn.net/zhu_xiao_yuan/article/details/51252300 datatables参数配置详解 http://blog.csdn.net/j ...
- Java与.NET机制比较分析
一.概述 不管是什么语言开发的web应用程序,都是在解决一个问题,那就是用户输入url怎么把对应的页面响应出来,如何通过url映射到响应的类,由于自己做asp.net的时间也不短了,还算是对asp.n ...
- datagrid后台分页js
$(function () { gridbind(); bindData(); }); //表格绑定function gridbind() { $('#dg').datagrid({ title: ' ...
- C++ 类的多态四(虚析构函数的重要性)
//虚析构函数的重要性 #include<iostream> using namespace std; /* 虚析构函数 主要用在多态中,用来释放子类对象内存空间,如果不使用虚析构函数, ...