Класс для проверки сложности пароля. На регулярках - C#

Узнай цену своей работы

Формулировка задачи:

Помогите с регулярными выражениями, кто в них разбирается. Правильно ли тут все? Нужно доработать этот класс. Думаю очень многим он может пригодится.
class PasswordStrength
    {
        public PasswordStrength(string password)
        {
            passwordStrength(password);
        }
 
        //private string password;
        private const string badPass = "Низкая";
        private const string normalPass = "Средняя";
        private const string highPass = "Высокая";
        private const string veryHighPass = "Очень высокая";
 
        public string ContentPass { get; set; }
 
        public void passwordStrength(string password)
        {
            int score = 0;
            //password < 4
            if (password.Length < 4)
            {
                ContentPass = badPass;
                return;
            }
            
            //пароль содержит 3 числа
            var regex = new Regex(@"(.*[0 - 9].*[0 - 9].*[0 - 9])");
            if (regex.IsMatch(password))
            {
                score += 5;
            }
            
            //пароль содержит два спец символа
            regex = new Regex(@"(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])");
            if (regex.IsMatch(password))
            { 
                score += 10; 
            }
            else
            {
                score -= 10;
            }
 
            //пароль содержит символы верхнего и нижнего регистра
            regex = new Regex(@"([a - z].*[A - Z])|([A - Z].*[a - z])");
            if (regex.IsMatch(password))
            {
                score += 10;
            }
            else
            {
                score -= 10;
            }
            
            //пароль содержит буквы и цифры
            regex = new Regex(@"([a - zA - Z])");
            var regex1 = new Regex(@"([0 - 9])");
            if (regex.IsMatch(password) && regex1.IsMatch(password))
            {
                score += 15;
            }
            else
            {
                score -= 15;
            }
 
            //пароль содержит спец символы и цифры
            regex = new Regex(@"([!,@,#,$,%,^,&,*,?,_,~])");
            regex1 = new Regex(@"([0-9])");
            if (regex.IsMatch(password) && regex1.IsMatch(password))
            {
                score += 15;
            }
            else
            {
                score -= 15;
            }
            
            //пароль содержит спец символы и буквы
            regex = new Regex(@"([!,@,#,$,%,^,&,*,?,_,~])");
            regex1 = new Regex(@"([a-zA-Z])");
            if (regex.IsMatch(password) && regex1.IsMatch(password))
            {
                score += 15;
            }
            else
            {
                score -= 15;
            }
            
            //password is just a nubers or chars
            regex = new Regex(@"^\w +$");
            regex1 = new Regex(@"^\d +$");
            if (regex.IsMatch(password) || regex1.IsMatch(password))
            { 
                score -= 10; 
            }
                
            //verifing 0 < score < 100
            if (score < 0) score = 0;
            if (score > 100) score = 100;
 
            if (score < 10)
            {
                ContentPass = badPass;
                return;
            }
            if (score < 25)
            {
                ContentPass = normalPass;
                return;
            }
            if (score < 61)
            {
                ContentPass = highPass;
                return;
            }
 
            if (score <= 100) 
            {
                ContentPass = veryHighPass;
                return;
            }
        }
    }

Решение задачи: «Класс для проверки сложности пароля. На регулярках»

textual
Листинг программы
public static class PasswdUtils
{
public static string[] badPasswords = new string[]
        {
            "123456", "123456789", "qwerty", "111111", "1234567", "666666", "12345678", "7777777", "123321", "0", "654321", "1234567890", "123123", "555555", "vkontakte", "gfhjkm", "159753", "777777", "TempPassWord", "qazwsx", "1q2w3e", "1234", "112233", "121212", "qwertyuiop", "qq18ww899", "987654321", "12345", "zxcvbn", "zxcvbnm", "999999", "samsung", "ghbdtn", "1q2w3e4r", "1111111", "123654", "159357", "131313", "qazwsxedc", "123qwe", "222222", "asdfgh", "333333", "9379992", "asdfghjkl", "4815162342", "12344321", "любовь", "88888888", "11111111", "knopka", "пароль", "789456", "qwertyu", "1q2w3e4r5t", "iloveyou", "vfhbyf", "marina", "password", "qweasdzxc", "10203", "987654", "yfnfif", "cjkysirj", "nikita", "888888", "йцукен", "vfrcbv", "k.,jdm", "qwertyuiop[]", "qwe123", "qweasd", "natasha", "123123123", "fylhtq", "q1w2e3", "stalker", "1111111111", "q1w2e3r4", "nastya", "147258369", "147258", "fyfcnfcbz", "1234554321", "1qaz2wsx", "andrey", "111222", "147852", "genius", "sergey", "7654321", "232323", "123789", "fktrcfylh", "spartak", "admin", "test", "123", "azerty", "abc123", "lol123", "easytocrack1", "hello", "saravn", "holysh!t", "1", "Test123", "tundra_cool2", "456", "dragon", "thomas", "killer", "root", "1111", "pass", "master", "aaaaaa", "a", "monkey", "daniel", "asdasd", "e10adc3949ba59abbe56e057f20f883e", "changeme", "computer", "jessica", "letmein", "mirage", "loulou", "lol", "superman", "shadow", "admin123", "secret", "administrator", "sophie", "kikugalanetroot", "doudou", "liverpool", "hallo", "sunshine", "charlie", "parola", "100827092", "/", "michael", "andrew", "password1", "fuckyou", "matrix", "cjmasterinf", "internet", "hallo123", "eminem", "demo", "gewinner", "pokemon", "abcd1234", "guest", "ngockhoa", "martin", "sandra", "asdf", "hejsan", "george", "qweqwe", "lollipop", "lovers", "q1q1q1", "tecktonik", "naruto", "12", "password12", "password123", "password1234", "password12345", "password123456", "password1234567", "password12345678", "password123456789", "000000", "maximius", "123abc", "baseball1", "football1", "soccer", "princess", "slipknot", "11111", "nokia", "super", "star", "666999", "12341234", "1234321", "135790", "159951", "212121", "zzzzzz", "121314", "134679", "142536", "19921992", "753951", "7007", "1111114", "124578", "19951995", "258456", "qwaszx", "zaqwsx", "55555", "77777", "54321", "qwert", "22222", "33333", "99999", "88888", "66666",
            "iloveu", "пароль"
        };
        public static Random rnd = new Random();
        
        public enum PasswordStrength
        {
            Paranoic, Hard, Normal, Weak
        }
 
        public static PasswordStrength GetPasswordStrengthRate(int strength)
        {
            if (strength > 300)
                return PasswordStrength.Paranoic;
            else
                if (strength > 200)
                return PasswordStrength.Hard;
            else
                if (strength > 100)
                return PasswordStrength.Normal;
            else
                return PasswordStrength.Weak;
        }
 
        public static int CheckPasswordStrength(string password)
        {
            double multi0 = 1.0;
            double multi1 = 1.0;
            double multi2 = 1.0;
            double multi3 = 0;
            int score = 0;
            foreach (var bp in badPasswords)
            {
                if (password.ToLower().Contains(bp.ToLower()))
                    multi0 = 0.75;
                else
                    if (bp.ToLower() == password.ToLower())
                    multi0 = 0.125;
            }
            List<char> usedChars = new List<char>();
            foreach (var chr in password)
            {
                if (!usedChars.Contains(chr))
                    usedChars.Add(chr);
            }
            multi1 = FrequencyFactor(password.ToLower());
 
            score += password.Length * 15;
 
            Dictionary<string, double> patterns = new Dictionary<string, double> { { @"1234567890", 0.0 }, //включает цифры
                                                                         { @"[a-z]", 0.1 }, //буквы низ. регистра
                                                                         { @"[ёа-я]", 0.2 }, //буквы низ. регистра
                                                                         { @"[A-Z]", 0.2 }, //буквы выс. регистра
                                                                         { @"[ЁА-Я]", 0.3 }, //буквы выс. регистра
                                                                         {  "[!,@#\\$%\\^&\\*?_~=;:'\"<>[]()~`\\\\|/]", 0.4 },  //символы
                                                                         { @"[¶©]", 0.5} }; //Спецсимволы
 
            foreach (var pattern in patterns)
                if (Regex.Matches(password, pattern.Key).Count > 0)
                    multi2 += pattern.Value;
 
            if (password.Length > 2)
                multi3 += 0;
            if (password.Length > 4)
                multi3 += 0.25;
            if (password.Length > 6)
                multi3 += 0.75;
            if (password.Length > 8)
                multi3 += 1.0;
 
 
            return (int)(score * multi0 * multi1 * multi2);
        }
        
        static double FrequencyFactor(string password)
        {
            HashSet<char> differentSymbols = new HashSet<char>(password.ToCharArray());
 
            return Map(differentSymbols.Count, 1.0, password.Length, 0.1, 1);
        }
 
        static double Map(double value, double fromLower, double fromUpper, double toLower, double toUpper)
        {
            return toLower + (value - fromLower) / (fromUpper - fromLower) * (toUpper - toLower);
        }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.786 из 5
Похожие ответы