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

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

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

Помогите с регулярными выражениями, кто в них разбирается. Правильно ли тут все? Нужно доработать этот класс. Думаю очень многим он может пригодится.
Листинг программы
  1. class PasswordStrength
  2. {
  3. public PasswordStrength(string password)
  4. {
  5. passwordStrength(password);
  6. }
  7. //private string password;
  8. private const string badPass = "Низкая";
  9. private const string normalPass = "Средняя";
  10. private const string highPass = "Высокая";
  11. private const string veryHighPass = "Очень высокая";
  12. public string ContentPass { get; set; }
  13. public void passwordStrength(string password)
  14. {
  15. int score = 0;
  16. //password < 4
  17. if (password.Length < 4)
  18. {
  19. ContentPass = badPass;
  20. return;
  21. }
  22. //пароль содержит 3 числа
  23. var regex = new Regex(@"(.*[0 - 9].*[0 - 9].*[0 - 9])");
  24. if (regex.IsMatch(password))
  25. {
  26. score += 5;
  27. }
  28. //пароль содержит два спец символа
  29. regex = new Regex(@"(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])");
  30. if (regex.IsMatch(password))
  31. {
  32. score += 10;
  33. }
  34. else
  35. {
  36. score -= 10;
  37. }
  38. //пароль содержит символы верхнего и нижнего регистра
  39. regex = new Regex(@"([a - z].*[A - Z])|([A - Z].*[a - z])");
  40. if (regex.IsMatch(password))
  41. {
  42. score += 10;
  43. }
  44. else
  45. {
  46. score -= 10;
  47. }
  48. //пароль содержит буквы и цифры
  49. regex = new Regex(@"([a - zA - Z])");
  50. var regex1 = new Regex(@"([0 - 9])");
  51. if (regex.IsMatch(password) && regex1.IsMatch(password))
  52. {
  53. score += 15;
  54. }
  55. else
  56. {
  57. score -= 15;
  58. }
  59. //пароль содержит спец символы и цифры
  60. regex = new Regex(@"([!,@,#,$,%,^,&,*,?,_,~])");
  61. regex1 = new Regex(@"([0-9])");
  62. if (regex.IsMatch(password) && regex1.IsMatch(password))
  63. {
  64. score += 15;
  65. }
  66. else
  67. {
  68. score -= 15;
  69. }
  70. //пароль содержит спец символы и буквы
  71. regex = new Regex(@"([!,@,#,$,%,^,&,*,?,_,~])");
  72. regex1 = new Regex(@"([a-zA-Z])");
  73. if (regex.IsMatch(password) && regex1.IsMatch(password))
  74. {
  75. score += 15;
  76. }
  77. else
  78. {
  79. score -= 15;
  80. }
  81. //password is just a nubers or chars
  82. regex = new Regex(@"^\w +$");
  83. regex1 = new Regex(@"^\d +$");
  84. if (regex.IsMatch(password) || regex1.IsMatch(password))
  85. {
  86. score -= 10;
  87. }
  88. //verifing 0 < score < 100
  89. if (score < 0) score = 0;
  90. if (score > 100) score = 100;
  91. if (score < 10)
  92. {
  93. ContentPass = badPass;
  94. return;
  95. }
  96. if (score < 25)
  97. {
  98. ContentPass = normalPass;
  99. return;
  100. }
  101. if (score < 61)
  102. {
  103. ContentPass = highPass;
  104. return;
  105. }
  106. if (score <= 100)
  107. {
  108. ContentPass = veryHighPass;
  109. return;
  110. }
  111. }
  112. }

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

textual
Листинг программы
  1. public static class PasswdUtils
  2. {
  3. public static string[] badPasswords = new string[]
  4.         {
  5.             "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",
  6.             "iloveu", "пароль"
  7.         };
  8.         public static Random rnd = new Random();
  9.        
  10.         public enum PasswordStrength
  11.         {
  12.             Paranoic, Hard, Normal, Weak
  13.         }
  14.  
  15.         public static PasswordStrength GetPasswordStrengthRate(int strength)
  16.         {
  17.             if (strength > 300)
  18.                 return PasswordStrength.Paranoic;
  19.             else
  20.                 if (strength > 200)
  21.                 return PasswordStrength.Hard;
  22.             else
  23.                 if (strength > 100)
  24.                 return PasswordStrength.Normal;
  25.             else
  26.                 return PasswordStrength.Weak;
  27.         }
  28.  
  29.         public static int CheckPasswordStrength(string password)
  30.         {
  31.             double multi0 = 1.0;
  32.             double multi1 = 1.0;
  33.             double multi2 = 1.0;
  34.             double multi3 = 0;
  35.             int score = 0;
  36.             foreach (var bp in badPasswords)
  37.             {
  38.                 if (password.ToLower().Contains(bp.ToLower()))
  39.                     multi0 = 0.75;
  40.                 else
  41.                     if (bp.ToLower() == password.ToLower())
  42.                     multi0 = 0.125;
  43.             }
  44.             List<char> usedChars = new List<char>();
  45.             foreach (var chr in password)
  46.             {
  47.                 if (!usedChars.Contains(chr))
  48.                     usedChars.Add(chr);
  49.             }
  50.             multi1 = FrequencyFactor(password.ToLower());
  51.  
  52.             score += password.Length * 15;
  53.  
  54.             Dictionary<string, double> patterns = new Dictionary<string, double> { { @"1234567890", 0.0 }, //включает цифры
  55.                                                                          { @"[a-z]", 0.1 }, //буквы низ. регистра
  56.                                                                          { @"[ёа-я]", 0.2 }, //буквы низ. регистра
  57.                                                                          { @"[A-Z]", 0.2 }, //буквы выс. регистра
  58.                                                                          { @"[ЁА-Я]", 0.3 }, //буквы выс. регистра
  59.                                                                          {  "[!,@#\\$%\\^&\\*?_~=;:'\"<>[]()~`\\\\|/]", 0.4 },  //символы
  60.                                                                          { @"[¶©]", 0.5} }; //Спецсимволы
  61.  
  62.             foreach (var pattern in patterns)
  63.                 if (Regex.Matches(password, pattern.Key).Count > 0)
  64.                     multi2 += pattern.Value;
  65.  
  66.             if (password.Length > 2)
  67.                 multi3 += 0;
  68.             if (password.Length > 4)
  69.                 multi3 += 0.25;
  70.             if (password.Length > 6)
  71.                 multi3 += 0.75;
  72.             if (password.Length > 8)
  73.                 multi3 += 1.0;
  74.  
  75.  
  76.             return (int)(score * multi0 * multi1 * multi2);
  77.         }
  78.        
  79.         static double FrequencyFactor(string password)
  80.         {
  81.             HashSet<char> differentSymbols = new HashSet<char>(password.ToCharArray());
  82.  
  83.             return Map(differentSymbols.Count, 1.0, password.Length, 0.1, 1);
  84.         }
  85.  
  86.         static double Map(double value, double fromLower, double fromUpper, double toLower, double toUpper)
  87.         {
  88.             return toLower + (value - fromLower) / (fromUpper - fromLower) * (toUpper - toLower);
  89.         }
  90. }

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


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

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

14   голосов , оценка 3.786 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы