REGEX для проверки пароля - PullRequest
0 голосов
/ 20 января 2010
  • не менее 3 букв
  • не более 15
  • символов A-Za-z0-9
  • специальные символы @ # $% ^ & + =

Вот что у меня есть:

Regex.IsMatch(Password.Text, @"^[A-Za-z0-9@#$%^&+=]{3,15}$ ")

Всегда возвращает false.

Пожалуйста, помогите.

Ответы [ 3 ]

3 голосов
/ 20 января 2010

Убрать пробел в конце строки регулярного выражения.Также: исправлены возможные опечатки.

Regex.IsMatch(Password.Text, @"^[A-Za-z0-9@#$%^&+=]{3,15}$")
1 голос
/ 20 января 2010

Как уже упоминалось, это очень очень плохая идея.Гораздо лучшим подходом было бы проверить надежность пароля введенного пароля и установить счет, который пароли должны побить.

Существуют алгоритмы для расчета надежности паролей.Следующее взято из Delphi Encryption Compendium Хагена Реддмана (таким образом, на Паскале, но я думаю, это можно легко перевести)

function PassphraseQuality(const Password: String): Extended; 
// returns computed Quality in range 0.0 to 1.0 
// source extracted from Delphi Encryption Compendium, DEC 

  function Entropy(P: PByteArray; L: Integer): Extended; 
  var 
    Freq: Extended; 
    I: Integer; 
    Accu: array[Byte] of LongWord; 
  begin 
    Result := 0.0; 
    if L <= 0 then Exit; 
    FillChar(Accu, SizeOf(Accu), 0); 
    for I := 0 to L-1 do Inc(Accu[P[I]]); 
    for I := 0 to 255 do 
      if Accu[I] <> 0 then 
      begin 
        Freq := Accu[I] / L; 
        Result := Result - Freq * (Ln(Freq) / Ln(2)); 
      end; 
  end; 

  function Differency: Extended; 
  var 
    S: String; 
    L,I: Integer; 
  begin 
    Result := 0.0; 
    L := Length(Password); 
    if L <= 1 then Exit; 
    SetLength(S, L-1); 
    for I := 2 to L do 
      Byte(S[I-1]) := Byte(Password[I-1]) - Byte(Password[I]); 
    Result := Entropy(Pointer(S), Length(S)); 
  end; 

  function KeyDiff: Extended; 
  const 
    Table = '^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=?`QWERTZUIOPÜ*ASDFGHJKLÖÄ''>YXCVBNM;:_'; 
  var 
    S: String; 
    L,I,J: Integer; 
  begin 
    Result := 0.0; 
    L := Length(Password); 
    if L <= 1 then Exit; 
    S := Password; 
    UniqueString(S); 
    for I := 1 to L do 
    begin 
      J := Pos(S[I], Table); 
      if J > 0 then S[I] := Char(J); 
    end; 
    for I := 2 to L do 
      Byte(S[I-1]) := Byte(S[I-1]) - Byte(S[I]); 
    Result := Entropy(Pointer(S), L-1); 
  end; 

const 
  GoodLength = 10.0; // good length of Passphrases 
var 
  L: Extended; 
begin 
  Result := Entropy(Pointer(Password), Length(Password)); 
  if Result <> 0 then 
  begin 
    Result := Result * (Ln(Length(Password)) / Ln(GoodLength)); 
    L := KeyDiff + Differency; 
    if L <> 0 then L := L / 64; 
    Result := Result * L; 
    if Result < 0 then Result := -Result; 
    if Result > 1 then Result := 1; 
  end; 
end;
1 голос
/ 20 января 2010

С какой стати вы хотите ограничить возможными паролями?!?

  • Зачем запрещать использование французских и немецких символов (вообще юникода)?
  • Зачем ограничивать пароли до 15 символов? Многие люди используют целые парольные фразы.
  • Зачем ограничивать специальные символы? Почему вы исключаете . и :?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...