Класс для проверки сложности пароля. На регулярках - 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);
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д