2010-06-28 12 views
7

muszę silny regex walidacja hasłoSilne hasło regex

Special Characters - Not Allowed 
Spaces - Not Allowed 
Numeric Character - At least one character 
At least one Capital Letter 
Minimum and Maximum Length of field - 6 to 12 Characters 
Repetitive Characters - Allowed only two repetitive characters 

moim Regex jest ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s)(?=(?:(\w)(?!\1{2}))+).{6,12}$ ale ignoruje znaki specjalne (gdzie dodać?)

Proszę o pomoc!

+12

Co skłoniło Cię do przekonania, że ​​wyrażenie regularne było najlepszym sposobem rozwiązania tego problemu? –

+7

Dlaczego nie akceptujesz spacji i znaków specjalnych? Czyż nie jest to * słabe * wyrażenie regularne zamiast silnego? Twoje kryteria również uniemożliwiają użytkownikowi wprowadzenie hasła (serii słów, o wiele dłuższych niż normalne hasło), ponieważ potrzebujesz cyfry, spacji i ograniczenia długości hasła. – Douglas

+0

Douglas, tylko znaki specjalne dozwolone (@): *, -, + etc nie są dozwolone znaki specjalne. To jest zadanie :) – Maxim

Odpowiedz

24
^(?=.*[A-Z])(?=.*\d)(?!.*(.)\1\1)[[email protected]]{6,12}$ 
  • znaków specjalnych - nie dopuszcza
  • Spaces - niedozwolone
  • minimalna i maksymalna długość pola - od 6 do 12 znaków
    Met przez [[email protected]]{6,12}
  • Znak numeryczny - co najmniej jeden znak
    Met przez positive lookahead(?=.*\d)
  • Przynajmniej jedna litera
    spełnione przez pozytywnej uprzedzona (?=.*[A-Z])
  • Powtarzające się znaki - dozwolone jedynie dwa powtarzające się znaki
    Nie jestem pewien co masz na myśli przez to. Negatywny uprzedzający (?!.*(.)\1\1) zapewnia, że ​​żaden znak nie może pojawiać się więcej niż dwa razy z rzędu. Substring aa jest w porządku, aaa nie jest.
    Ustaw jako (?!.*(.+)\1\1), aby odrzucić powtarzające się podciągi o długości większej niż jeden (np. ababab) lub dodaj .* przed \1, aby również odrzucić nie ciągłe powtarzające się wyglądy.
+0

Powtarzające się znaki - mam na myśli: dozwolone paassword, a nie dozwolone paaassword lub passsword. Co muszę zrobić w tym przypadku? – Maxim

+0

Nadal utrzymuję, że mój kod jest dużo czytelniejszy/łatwiejszy w utrzymaniu! Bah, regex za wszystko i cokolwiek. – Noldorin

+1

@Maxim Wygląda na to, że moje zrozumienie było poprawne. Podane wyrażenie powinno to zrobić. – Amarghosh

29

Nie brzmi jak zadanie szczególnie odpowiednie dla Regex, ponieważ chcesz testować wiele warunków jednocześnie. (Można użyć wielu regexes, ale potem normalny C# z LINQ jest ładniejszy sposób, aby go przetestować.) Spróbuj następującą funkcję:

public static bool IsStrongPassword(string password) 
{ 
    // Minimum and Maximum Length of field - 6 to 12 Characters 
    if (password.Length < 6 || password.Length > 12) 
     return false; 

    // Special Characters - Not Allowed 
    // Spaces - Not Allowed 
    if (!(password.All(c => char.IsLetter(c) || char.IsDigit(c)))) 
     return false; 

    // Numeric Character - At least one character 
    if (!password.Any(c => char.IsDigit(c))) 
     return false; 

    // At least one Capital Letter 
    if (!password.Any(c => char.IsUpper(c))) 
     return false; 

    // Repetitive Characters - Allowed only two repetitive characters 
    var repeatCount = 0; 
    var lastChar = '\0'; 
    foreach(var c in password) 
    { 
     if (c == lastChar) 
      repeatCount++; 
     else 
      repeatCount = 0; 
     if (repeatCount == 2) 
      return false; 
     lastChar = c; 
    } 

    return true; 
} 

upewnij się importować System.Linq oczywiście, i jesteś gotowa do pracy.

+0

Powtarzające się znaki? – Maxim

+0

Być może można połączyć powyższe podejście LINQ z kilkoma wyrażeń regularnych, które testują rzeczy, w których wyrazy regularne są dobre? –

+1

@Maxim: Zmieniono, to teraz włączone. Powtarzające się znaki to jedyny test, jaki mogę zrobić * przy użyciu regex, ale uważam, że obecne podejście jest nadal w porządku. – Noldorin

2

W odpowiedzi na noldorski char.IsNumeric należy zastąpić char.IsDigit dla C#/.NET 4.0

1

Poniższy jQuery plugin o nazwie pwdMeter działa i wygląda na fajny sposób, aby pokazać użytkownikowi co jest i co nie jest silnym hasłem.

http://shouvik.net/pwdmeter.php

+0

to jest naprawdę niesamowite – Eliseo