javascrpt密码强度校验函数详解


Posted in Javascript onMarch 18, 2020

最近写了个密码强度验证的函数,主要验证以下内容

1、密码最小和最大长度

2、连续字符串出现的次数

3、字符连续出现的次数

4、禁止特定的字符串作为密码

5、密码字符串的组合强度要求,必须含有大小写字母,必须含有数字,必须含有特殊字符

6、输入密码必须与确认密码一致

7、支持禁止使用用户名作为密码

8、是否存在连续性的字符串,是否存在逆序性的字符串

(function(window, verifyPwd){
  window.verifyPwd = {
    /*最小长度*/
    minLength  : 6
 
    /*最大长度*/
    maxLength  : 18,
 
    /*字符重复次数*/
    repeatCount : 0,
 
    /*连续字符*/
    seriesCount : 3,
 
    /*特定过滤字符串*/
    filter   : [
      "qaz",
      "wsx",
      "edc",
      "qwe",
      "asd",
      "zxc"
    ],
 
    /*允许的字符串*/
    arrRegex : ['[0-9]', '[a-z]', '[A-Z]', '[!@#$%^&*()_-]' ],
 
    /**
     * 验证密码
     * @param userName   用户名
     * @param pwd      密码
     * @param confirmPwd  确认密码
     * @returns {boolean}
     */
    verify : function(userName, pwd, confirmPwd){
      userName = trim(userName);
      pwd   = trim(pwd);
 
      if(!userName || userName.length == 0){
        alert('请先输入用户名');
 
        return false;
      }
 
      if(!pwd || pwd.length == 0){
        alert('请输入密码');
 
        return false;
      }
 
      if (pwd.length < this.minLength) {
        alert('密码长度至少需要' + this.minLength + '位');
 
        return false;
      }
 
      if (pwd.length > this.maxLength) {
        alert('密码长度超过'+ this.maxLength +'位');
        return false;
      }
 
      /*判断输入密码与确认密码是否一致*/
      if(confirmPwd && confirmPwd.length > 0){
        if(pwd != confirmPwd){
          alert('输入密码与确认密码不一致');
          return false;
        }
      }
 
      /*判断密码中是否存在用户名*/
      if (pwd.indexOf(userName) >= 0) {
        alert('密码中不能出现用户名为' + userName);
        return false;
      }
 
      if (!eval('/' + this.arrRegex[0] + '/').test(pwd)) {
        alert('密码没有包含数字');
        return false;
      }
 
      if (!eval('/' + this.arrRegex[1] + '/').test(pwd)) {
        alert('密码没有包含小写字母');
        return false;
      }
 
      if (!eval('/' + this.arrRegex[2] + '/').test(pwd)) {
        alert('密码没有包含大写字母');
        return false;
      }
 
      if (!eval('/' + this.arrRegex[3] + '/').test(pwd)) {
        alert('密码没有包含!@#$%&*_等至少一个特殊字符');
        return false;
      }
 
      /*判断是否存在过滤性字符串*/
      if(this.filter.length > 0){
        for(var i = 0, length = this.filter.length; i < length; i++){
          var value = this.filter[i];
 
          if(pwd.indexOf(value) < 0){
            continue;
          }
 
          alert("密码中不允许含有"+ value);
 
          return false;
        }
      }
 
      /*判断是否存在重复字符串*/
      if(this.isRepeate(pwd)){
        alert('密码中不能出现重复字符');
        return false;
      }
 
      /*判断是否存在连续性字符串*/
      if(this.isSeries(pwd)){
        alert('密码中不能存在'+ this.seriesCount +'个以上的连续字符');
        return false;
      }
 
      return true;
    },
 
    /**
     * 是否存在重复字符串
     * @param pwd    密码
     * @returns {boolean}
     */
    isRepeate : function(pwd){
      if(pwd && pwd.length > 0){
        for(var i = 0, length = pwd.length; i < length; i++){
          var currentChar = pwd.charAt(i);
          var prevChar  = i == 0 ? "" : pwd.charAt(i - 1);
 
          if(currentChar == prevChar){
            return true;
          }
        }
      }
 
      return false;
    },
 
    /**
     * 是否存在连续性字符串
     * @param pwd    密码
     * @returns {boolean}
     */
    isSeries : function(pwd){
      if(pwd && pwd.length > 0) {
        /*自身算起*/
        var ascSeriesCount = 1;
        var descSeriesCount= 1;
 
        /*存在顺序型的连续性的字符串*/
        for (var i = 0, length = pwd.length; i < length; i++) {
          var currentCharCode = pwd.charCodeAt(i);
          var prevCharCode  = i == 0 ? "" : pwd.charCodeAt(i - 1);
 
          if(currentCharCode == prevCharCode + 1){
            ascSeriesCount++;
 
            if(ascSeriesCount == this.seriesCount){
              return true;
            }
          } else{
            ascSeriesCount = 1;
          }
        }
 
        /*存在逆序性的连续性的字符串*/
        for (var i = pwd.length - 1; i >= 0; i--) {
          var currentCharCode = pwd.charCodeAt(i);
          var prevCharCode  = (i - 1) >= 0 ? pwd.charCodeAt(i - 1) : "";
 
          if(currentCharCode + 1 == prevCharCode){
            descSeriesCount++;
 
            if(descSeriesCount == this.seriesCount){
              return true;
            }
          } else{
            descSeriesCount = 1;
          }
        }
      }
 
      return false;
    },
 
    /**
     * 初始化方法
     * @param userNameId  用户id
     * @param pwdId
     */
    init : function(userNameId, pwdId){
      $("#"+ pwdId).on("blur", function(){
        var userName = $("#"+ userNameId).val();
        var pwd = this.value;
 
        if(userName.length == 0){
          $("#"+ userNameId).focus();
          alert("请输入用户名");
 
          return false;
        }
 
        /*若验证正确,进行加密处理*/
        if(this.verify(userName, pwd)){
          pwd = md5(pwd);
          $("#"+ pwdId).val(pwd);
        }
      });
    }
  }
})(window, undefined);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
理解Javascript_08_函数对象
Oct 15 Javascript
javascript 基础篇4 window对象,DOM
Mar 14 Javascript
客户端js判断文件类型和文件大小即限制上传大小
Nov 20 Javascript
Javascript 实现复制(Copy)动作方法大全
Jun 20 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
May 11 Javascript
无缝滚动的简单实现代码(推荐)
Jun 07 Javascript
老生常谈js中0到底是 true 还是 false
Mar 08 Javascript
Vue数组更新及过滤排序功能
Aug 10 Javascript
vue2里面ref的具体使用方法
Oct 27 Javascript
vue.js+element-ui动态配置菜单的实例
Sep 07 Javascript
详解vue-property-decorator使用手册
Jul 29 Javascript
layui 实现自动选择radio单选框(checked)的方法
Sep 03 Javascript
Node.js Domain 模块实例详解
Mar 18 #Javascript
js判断密码强度的方法
Mar 18 #Javascript
vue项目配置使用flow类型检查的步骤
Mar 18 #Javascript
Vue项目中使用flow做类型检测的方法
Mar 18 #Javascript
JavaScript正则表达式验证登录实例
Mar 18 #Javascript
JS正则表达式验证密码强度
Mar 18 #Javascript
原生js实现密码强度验证功能
Mar 18 #Javascript
You might like
模仿OSO的论坛(一)
2006/10/09 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
Python3 操作符重载方法示例
2017/11/23 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
Pandas的Apply函数具体使用
2020/07/21 Python
AmazeUI框架搭建的方法步骤(图文)
2020/08/17 HTML / CSS
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
AOP的定义以及作用
2013/09/08 面试题
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
师范生自荐信
2013/10/27 职场文书
公司新年寄语
2014/04/04 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
交通事故协议书范文
2014/10/23 职场文书
居委会工作总结2015
2015/05/18 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
vue实现拖拽交换位置
2022/04/07 Vue.js
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电