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 相关文章推荐
学习YUI.Ext 第四天--对话框Dialog的使用
Mar 10 Javascript
js实现上传图片之上传前预览图片
Mar 25 Javascript
javascript模拟枚举的简单实例
Mar 06 Javascript
js常用数组操作方法简明总结
Jun 20 Javascript
关于编写性能高效的javascript事件的技术
Nov 28 Javascript
js实现继承的5种方式
Dec 01 Javascript
前端面试知识点目录一览
Apr 15 Javascript
说说如何利用 Node.js 代理解决跨域问题
Apr 22 Javascript
微信小程序点餐系统开发常见问题汇总
Aug 06 Javascript
jquery添加div实现消息聊天框
Feb 08 jQuery
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
Mar 07 Javascript
Vue 构造选项 - 进阶使用说明
Aug 14 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 chmod 函数与批量修改文件目录权限
2010/05/10 PHP
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
php清除和销毁session的方法分析
2015/03/19 PHP
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
浅析Node.js的Stream模块中的Readable对象
2015/07/29 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
2016/09/23 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
python中类和实例如何绑定属性与方法示例详解
2017/08/18 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
python3中sys.argv的实例用法
2020/04/24 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
what is the difference between ext2 and ext3
2015/08/25 面试题
好家长事迹材料
2014/01/23 职场文书
手工社团活动方案
2014/02/17 职场文书
项目合作意向书范本
2014/04/01 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
指导老师鉴定意见
2015/06/05 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
详解Go与PHP的语法对比
2021/05/29 PHP