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变量作用域详解
Dec 06 Javascript
JS操作iframe里的dom(实例讲解)
Jan 29 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
Feb 20 Javascript
浅谈JavaScript数据类型
Mar 03 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
Jan 28 Javascript
基于jQuery实现仿百度首页选项卡切换效果
May 29 Javascript
浅析Bootstrap表格的使用
Jun 23 Javascript
总结在前端排序中遇到的问题
Jul 19 Javascript
整理关于Bootstrap过渡动画的慕课笔记
Mar 29 Javascript
JS常见构造模式实例对比分析
Aug 27 Javascript
vue实现动态列表点击各行换色的方法
Sep 13 Javascript
解决vue cli使用typescript后打包巨慢的问题
Sep 30 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
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
基于PHP一些十分严重的缺陷详解
2013/06/03 PHP
PHP CURL获取返回值的方法
2014/05/04 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
javascript xml为数据源的下拉框控件
2009/07/07 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
JS调用打印机功能简单示例
2016/11/28 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
python类和继承用法实例
2015/07/07 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
详解关于Django中ORM数据库迁移的配置
2018/10/08 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
临床医师专业个人自我评价
2014/01/08 职场文书
好人好事事迹材料
2014/02/12 职场文书
普通话宣传标语
2014/06/26 职场文书
销售顾问工作计划书
2014/08/15 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
2014年教务工作总结
2014/12/03 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
故宫导游词
2015/01/31 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
东京审判观后感
2015/06/01 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
springboot中的pom文件 project报错问题
2022/01/18 Java/Android