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 相关文章推荐
jquery分页对象使用示例
Apr 01 Javascript
js取整数、取余数的方法
May 11 Javascript
node.js实现逐行读取文件内容的代码
Jun 27 Javascript
深入浅析javascript立即执行函数
Oct 23 Javascript
基于jquery编写分页插件
Mar 07 Javascript
jquery判断页面网址是否有效的两种方法
Dec 11 Javascript
JavaScript中document.referrer的用法详解
Jul 04 Javascript
基于JQuery的Ajax方法使用详解
Aug 16 jQuery
JS自定义函数实现时间戳转换成date的方法示例
Aug 27 Javascript
spring+angular实现导出excel的实现代码
Feb 27 Javascript
vue props对象validator自定义函数实例
Nov 13 Javascript
vue.js this.$router.push获取不到params参数问题
Mar 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
德劲1103二次变频版的打磨
2021/03/02 无线电
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
2019/04/02 PHP
php判断目录存在的简单方法
2019/09/26 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
javascript制作的简单注册模块表单验证
2015/04/13 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
js闭包学习心得总结
2018/04/17 Javascript
原生JS实现的自动轮播图功能详解
2018/12/28 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
Python struct.unpack
2008/09/06 Python
python dict remove数组删除(del,pop)
2013/03/24 Python
python使用psutil模块获取系统状态
2016/08/27 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
2018/05/24 Python
解决Python3 被PHP程序调用执行返回乱码的问题
2019/02/16 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
美国钻石商店:Zales
2016/11/20 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
什么是属性访问器
2015/10/26 面试题
买房子个人收入证明
2014/01/16 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
个人承诺书格式范文
2015/04/29 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL