2012-10-15 11 views
11

Powiel możliwe:
Strong password regex
Need RegEx for password strength?Sprawdzanie Struny do wystarczająco silnym hasłem

Właśnie zastanawiałem się, jaki jest najlepszy sposób, aby wyszukać ciąg znaków dla określonych kryteriów (wytrzymałość hasło do być specyficzne) można by osiągnąć.

Do tej pory mam prosty:

if(password.Length <= 7) 
    { 
     errorMessage = "Your password must be at least 8 characters."; 
    } 

chciałbym móc sprawdzić literami, ale nie jestem pewien, co jest metoda lub procedura. Próbowałem Googling, przeszukując stronę: http://msdn.microsoft.com i przeszukując indeks mojej książki C# (C# Programowanie 3E, autorstwa Barbary Doyle), ale nie mogę znaleźć żadnego.

Wiem, że mógłbym spróbować ...:

foreach(char c in password) 
    { 
     if(c!='A' || c!='B' || c!='C' || c!='D' ..... || c!='Z') 
     { 
      errorMessage = "Your password must contain at least one capital letter"; 
     } 
    } 

... Ale to byłoby bardzo niechlujny i musiałaby być podwojona, aby sprawdzić, co najmniej jedną małą literę. Jestem pewien, że jest lepszy sposób, aby to zrobić, lub przynajmniej stenogram dla metody, którą pokazałem powyżej.

Ponadto, mogę zdecydować o sprawdzeniu hasła dla znaków specjalnych (wydaje się, że łatwiej zrobić to w powyższym przykładzie niż z dużymi i małymi literami, więc mogę po prostu użyć tego dla znaków specjalnych, jeśli zdecyduję się je wprowadzić). Jeśli istnieje łatwy (lub właściwy) sposób, aby to zrobić, również chciałbym mieć tę wiedzę.

W każdym razie dziękuję bardzo za pomoc, którą każdy może dać.

+2

To nie jest odpowiedź, ale upewnij się, że rozumiesz http://xkcd.com/936/ i http://xkcd.com/792/. Polecam również przeczytanie http://www.codinghorror.com /blog/2010/12/the-dirty-truth-about-web-passwords.html i przeszukując witrynę Jeffa pod kątem innych powiązanych artykułów. Następnie spójrz na Wyrażenia regularne, aby zweryfikować odpowiednią długość/złożoność. – David

+0

Zamiast serii zdań "jeśli ... to", prawdopodobnie będziesz chciał uruchomić hasło za pomocą wyrażeń regularnych. Spójrz na to [odpowiedź SO] (http://stackoverflow.com/questions/3131025/strong-password-regex). Myślę, że zapewnia to Wyrażenie Regularne, które pomoże ci. –

+0

@DarinDimitrov Hej, dziękuję za to, nie widziałem tego linku, ponieważ nie wiedziałem, aby szukać regex (chociaż, wydaje mi się, że to oczywiste). Moje przeprosiny i za link! – VoidKing

Odpowiedz

42

nie mogę wziąć kredytu, bo ukradł to od here

using System.Text; 
using System.Text.RegularExpressions; 

    public enum PasswordScore 
    { 
    Blank = 0, 
    VeryWeak = 1, 
    Weak = 2, 
    Medium = 3, 
    Strong = 4, 
    VeryStrong = 5 
    } 

    public class PasswordAdvisor 
    { 
    public static PasswordScore CheckStrength(string password) 
    { 
     int score = 0; 

     if (password.Length < 1) 
     return PasswordScore.Blank; 
     if (password.Length < 4) 
     return PasswordScore.VeryWeak; 

     if (password.Length >= 8) 
     score++; 
     if (password.Length >= 12) 
     score++; 
     if (Regex.Match(password, @"/\d+/", RegexOptions.ECMAScript).Success) 
     score++; 
     if (Regex.Match(password, @"/[a-z]/", RegexOptions.ECMAScript).Success && 
     Regex.Match(password, @"/[A-Z]/", RegexOptions.ECMAScript).Success) 
     score++; 
     if (Regex.Match(password, @"/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/", RegexOptions.ECMAScript).Success) 
     score++; 

     return (PasswordScore)score; 
    } 
    } 

Uwaga wykorzystanie regex do sprawdzania wielkimi literami. To wygląda na przyzwoite podejście, ponieważ sprawdza długość, wielkie i małe litery, cyfry i znaki specjalne.

** Aktualizacja **

Wiem, że pytanie jest już zamknięta, ale można dodać więcej wyjaśnień na VoidKing do zrozumienia niektórych pojęć.

PasswordScore jest zwracany z metody CheckStrength, która może być użyta jako warunek dla dalszych działań w kodzie.

Oto niesprawdzone demo jak można wykorzystać powyższy kod:

String password = "MyDummy_Password"; // Substitute with the user input string 
PasswordScore passwordStrengthScore = PasswordAdvisor.CheckStrength(password); 

switch (passwordStrengthScore) { 
    case PasswordScore.Blank: 
    case PasswordScore.VeryWeak: 
    case PasswordScore.Weak: 
      // Show an error message to the user 
      break; 
    case PasswordScore.Medium: 
    case PasswordScore.Strong: 
    case PasswordScore.VeryStrong: 
      // Password deemed strong enough, allow user to be added to database etc 
      break; 
} 

wyliczenia stosowane są w tym przypadku jako sposób klasyfikowania siłę hasła w postaci czytelnej dla grup ludzkich. Utrzymuje kod w czystości i wyjaśnia, co dzieje się w kodzie.

Jeśli chodzi o używanie Regexa, jeśli nie znasz ich koncepcji oraz sposobu i czasu ich użycia, sugeruję wykonanie pewnych badań, ponieważ mogą one być użyteczne w wielu różnych sytuacjach do sprawdzania wzorców w łańcuchach. Być może zacznij here.

+0

Dude, zasłużyłeś na repa, tylko na to, jak bardzo jest to przydatne ... Do tej pory nie miałem pojęcia, jak oceniają hasła w tej skali ... Dziękuję! – VoidKing

+0

W jaki sposób Regex działa dokładnie? Chciałbym móc tworzyć własne. Czy mam rację, zakładając, że sprawdza każdy znak (i ​​kolejne znaki, jeśli poprzedni jest dopasowany) dla dopasowań w ciągu ciągu regex? (wybacz mi, jeśli nie używam poprawnie wyrażenia regularnego, gramatycznie) – VoidKing

+0

Cóż, próbowałem tego, ale po prostu nie wiem wystarczająco dużo o tej procedurze. Właśnie zacząłem śledzić (lub używać tego) zewnętrzne pliki .cs i mogę to zrobić, ale nie mogę pracować z żadnymi danymi, które ta klasa ma dostarczać. Nigdy nie jest wystarczające, że mam kod, muszę go także zrozumieć, aby móc go zastosować w moich aplikacjach, a ja po prostu go tu nie zamieszczam. Czym jest ECMAScript? dlaczego wyliczać? jaki rodzaj danych jest zwracany? (Dowiedziałem się, że nie mogę rzucić tego w coś użytecznego). W każdym razie, dzięki za pomoc. – VoidKing

Powiązane problemy