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异步编程:异步数据收集的具体方法
Aug 19 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
Aug 03 Javascript
jquery实现弹出层登录和全屏层注册特效
Aug 28 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
Jan 14 Javascript
js实现异步循环实现代码
Feb 16 Javascript
jQuery实现二维码扫描功能
Jan 09 Javascript
xmlplus组件设计系列之图标(ICON)(1)
May 05 Javascript
AngularJS监听ng-repeat渲染完成的方法
Mar 20 Javascript
JavaScript门道之标准库
May 26 Javascript
vue.js与后台数据交互的实例讲解
Aug 08 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
Apr 25 Javascript
OpenLayers实现图层切换控件
Sep 25 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
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
PHP session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
Laravel日志用法详解
2016/10/09 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
2011/07/13 Javascript
window.addEventListener来解决让一个js事件执行多个函数
2012/12/26 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
ReactNative页面跳转实例代码
2016/09/27 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
Python类的定义、继承及类对象使用方法简明教程
2015/05/08 Python
python下MySQLdb用法实例分析
2015/06/08 Python
Python脚本暴力破解栅栏密码
2015/10/19 Python
详解Python装饰器由浅入深
2016/12/09 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
python3 logging日志封装实例
2020/04/08 Python
python 追踪except信息方式
2020/04/25 Python
基于python代码批量处理图片resize
2020/06/04 Python
python打开文件的方式有哪些
2020/06/29 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
python中字典增加和删除使用方法
2020/09/30 Python
关于Python字符编码与二进制不得不说的一些事
2020/10/04 Python
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
体育学院毕业生自荐信
2013/11/03 职场文书
外企求职信范文分享
2013/12/31 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
介绍信如何写
2015/01/31 职场文书
苏州园林导游词
2015/02/03 职场文书
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android