Проверка пароля с помощью кода Delphi

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

Должно быть 9 символов в длину. 1 символ должен быть в верхнем регистре, 1 должен быть в нижнем регистре, один должен быть числом, ['0'..'9'] и один должен быть из набора из 6 предопределенных символов ascii. ['!','#','%','&','*','@'].

Завершите это. и работает. Однако я хотел предоставить видимую проверку с помощью события onchange, чтобы изменить цвет поля редактирования на зеленый, если все требования выполнены, или КРАСНЫЙ, если нет. Проверка длины 9 символов достаточно легка, однако проверка 9 различных символов, чтобы убедиться, что есть по крайней мере 1 верхний, 1 нижний, 1 число и 1 из предопределенных, оказывается немного трудной. Может кто-нибудь помочь, пожалуйста? Спасибо.

Это код:

procedure TPasswordForm.edtPassword1Change(Sender: TObject);      
  begin
    if Length(edtPassword1.Text <> 9 then
       edtPassword1.Color := clRed
    else
       edtPassword1.Color := clLime;
  end;

2 ответа

Для фиксированных наборов символов функция может быть довольно простой. Обратите внимание, что он не принимает нелатинские символы.

function IsPasswordCrazy(const s: AnsiString): Boolean;
const
  C_Upcase = 1;
  C_Locase = 2;
  C_Digit = 4;
  C_SpecSym = 8;
  C_All = C_Upcase or C_Locase or C_Digit or C_SpecSym;
var
  i, keys: integer;
begin

  if Length(s) <> 9 then begin
    Result := False;
    Exit;
  end;

  keys := 0;
  for i := 1 to Length(s) do
    case s[i] of
      'A'..'Z': keys := keys or C_Upcase;
      'a'..'z': keys := keys or C_Locase;
      '0'..'9': keys := keys or C_Digit;
      '!','#','%','&','*','@': keys := keys or C_SpecSym;
    end;

  Result := keys = C_All;
end;

Это может быть достигнуто с помощью регулярных выражений

Вот пример с сообщениями об ошибках.

uses
  System.RegularExpressions;


function ValidatePassword(aPassword: String; var ErrorMessage: String): Boolean;
begin
  Result := false;
  ErrorMessage := '';

  if Length(aPassword) <> 9 then
  begin
    ErrorMessage := 'Password must be exactly 9 characters long';
    exit;
  end;

  if not TRegEx.IsMatch(aPassword, '[a-z]') then
  begin
    ErrorMessage := 'At least 1 character in the password must be lowercase';
    exit;
  end;

  if not TRegEx.IsMatch(aPassword, '[A-Z]') then
  begin
    ErrorMessage := 'At least 1 character in the password must be uppercase';
    exit;
  end;

  if not TRegEx.IsMatch(aPassword, '\d') then
  begin
    ErrorMessage := 'At least 1 character in the password must be a digit';
    exit;
  end;

  if not TRegEx.IsMatch(aPassword, '[!,#,%,&,*,@]') then
  begin
    ErrorMessage := 'At least 1 character in the password must be one of the following letters: !,#,%,&,*,@';
    exit;
  end;

  Result := True;
end;
Другие вопросы по тегам