Javascrpt密码强度校验函数

本文介绍了一个用于验证密码强度的JavaScript函数。该函数检查密码长度、重复字符、特定字符串过滤、字符组合强度等,并确保密码与确认密码一致,同时禁止使用用户名作为密码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     最近写了个密码强度验证的函数,主要验证以下内容


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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值