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 相关文章推荐
如何实现浏览器上的右键菜单
Jul 10 Javascript
用js实现的页面关键字密度查询代码
Dec 27 Javascript
jQuery的选择器中的通配符使用介绍
Mar 20 Javascript
node.js中的http.request方法使用说明
Dec 14 Javascript
jquery实现图片左右切换的方法
May 07 Javascript
JavaScript是如何实现继承的(六种方式)
Mar 31 Javascript
浏览器兼容的JS写法总结
Apr 27 Javascript
详解react如何在组件中获取路由参数
Jun 15 Javascript
Angular4表单验证代码详解
Sep 03 Javascript
Vue实现商品飞入购物车效果(电商项目)
Nov 26 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
Mar 08 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
Jul 07 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 批量删除数据的方法分析
2009/10/30 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
PHP实现简易图形计算器
2020/08/28 PHP
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
js 获取屏幕各种宽高的方法(浏览器兼容)
2013/05/15 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
vue通过路由实现页面刷新的方法
2018/01/25 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
使用pkg打包ThinkJS项目的方法步骤
2019/12/30 Javascript
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
2017/05/25 Python
python复制文件到指定目录的实例
2018/04/27 Python
有关Python的22个编程技巧
2018/08/29 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
Python如何实现转换URL详解
2019/07/02 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
python3字符串操作总结
2019/07/24 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
Python实现ATM系统
2020/02/17 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
2021/01/12 Python
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
自荐信封面
2013/12/04 职场文书
计算机专业毕业生自荐信
2013/12/31 职场文书
企业形象策划方案
2014/05/29 职场文书
《称赞》教学反思
2016/02/17 职场文书