密码强度验证

588 阅读1分钟

1、是否符合最小密码长度

        /// <summary>
        /// 是否符合最小密码长度
        /// </summary>
        /// <param name="passwordString">密码字符串</param>
        /// <param name="length">密码字长度</param>
        /// <returns></returns>
        public bool IsMatchMinLength(string passwordString, int length) {

            if (length < 1) {
                throw new Exception("密码最小长度验证值不能小于1");
            }
            if (passwordString == null )
            {
                return false;
            }
            return passwordString.Length >= length;
        }

2、是否符合最大密码长度

        /// <summary>
        /// 是否符合最大密码长度
        /// </summary>
        /// <param name="passwordString">密码字符串</param>
        /// <param name="length">密码字长度</param>
        /// <returns></returns>
        public bool IsMatchMaxLength(string passwordString, int length)
        {

            if (length < 1)
            {
                throw new Exception("密码最大长度验证值不能小于1");
            }
            if (passwordString == null)
            {
                return false;
            }
            return passwordString.Length <= length;
        }

3、连续3位及以上数字不能连号 | 连续3位及以上字母不能连号

        /// <summary>
        /// 连续3位及以上数字不能连号  |  连续3位及以上字母不能连号
        /// </summary>
        /// <param name="passwordString">密码字符串</param>
        /// <param name="errorMessage">异常信息</param>
        /// <returns></returns>
        public bool IsMatchABC123CBA321(string passwordString, ref string errorMessage)
        {
            errorMessage = "";
            if (passwordString == null) {
                errorMessage = "密码字符串为空(null)";
                return false;
            }

            char[] passwordChars = passwordString.ToCharArray();

            bool flag = false;
            int pLength = passwordChars.Length - 1;
            for (int pInd = 1; pInd < pLength; pInd++)
            {
                int firstIndex = (int)passwordChars[pInd - 1];
                int secondIndex = (int)passwordChars[pInd];
                int thirdIndex = (int)passwordChars[pInd + 1];

                // 顺序连号判断 如123、abc
                if (thirdIndex - secondIndex == 1 && secondIndex - firstIndex == 1)
                {
                    flag = true;
                    errorMessage = "密码不能存在连号的字符串“"
                        + Convert.ToString(passwordChars[pInd - 1])
                        + Convert.ToString(passwordChars[pInd])
                        + Convert.ToString(passwordChars[pInd + 1])
                        + "”";
                    break;
                }

                // 倒序连号判断 321、cba
                if (firstIndex - secondIndex == 1 && secondIndex - thirdIndex == 1)
                {
                    flag = true;
                    errorMessage = "密码不能存在连号的字符串“"
                        + Convert.ToString(passwordChars[pInd - 1])
                        + Convert.ToString(passwordChars[pInd])
                        + Convert.ToString(passwordChars[pInd + 1])
                        + "”";
                    break;
                }
            }
            
            return !flag;
        }

4、密码不能包括连续3个及以上相同字符

        /// <summary>
        /// 密码不能包括连续3个及以上相同字符
        /// </summary>
        /// <param name="passwordString">密码字符串</param>
        /// <param name="errorMessage">异常信息</param>
        /// <returns></returns>
        public bool IsMatchAAA(string passwordString, ref string errorMessage)
        {
            errorMessage = "";
            if (passwordString == null)
            {
                errorMessage = "密码字符串为空(null)";
                return false;
            }
            
            char[] passwordChars = passwordString.ToCharArray();
            int passwordLength = passwordChars.Length;

            // 重复字符缓存变量
            List<string> repeatStringList = new List<string>();

            // 临时重复字符
            string repeatString = "";
            // 是否重复
            bool isCharRepeat = false;
            // 最后字符索引
            int lastInd = passwordLength - 1;
            char firstChar = passwordChars[0];
            for (int pInd = 1; pInd < passwordLength; pInd++) {
                char currentChar = passwordChars[pInd];
                // 判断是否重复
                if (currentChar == firstChar)
                {
                    isCharRepeat = true;
                    repeatString += Convert.ToString(firstChar);

                    // 最后字符处理
                    if (lastInd == pInd) {
                        repeatString += Convert.ToString(firstChar);
                        isCharRepeat = false;
                        repeatStringList.Add(repeatString);
                        repeatString = "";
                    }

                }
                else {
                    // 若上一循环是重复的处理。
                    if (isCharRepeat)
                    {
                        repeatString += Convert.ToString(firstChar);
                        isCharRepeat = false;
                    }

                    // 满足连续3个及以上相同字符的条件,缓存重复的字符串
                    if (repeatString.Length >= 3)
                    {
                        repeatStringList.Add(repeatString);
                    }

                    // 更新参考字符
                    firstChar = currentChar;
                    // 清空临时重复字
                    repeatString = "";
                }
                
            }

            // 是否存在连续3个及以上相同字符
            bool isRepeat3 = repeatStringList.Count > 0;
            
            // 获取相同的字符串
            if (isRepeat3) {
                errorMessage = "密码不能包括连续3个及以上相同字符。相同的字符串有 "
                    + string.Format("“{0}”", string.Join("”,“", repeatStringList));
            }
            return !isRepeat3;            
        }