Подтвердите пароль с помощью регулярных выражений - PullRequest
0 голосов
/ 22 апреля 2019

Я пишу регулярное выражение для подтверждения пароля.

Ниже приведены политики паролей, которые я хочу охватить:

  1. Пароль можетсодержать только цифры, буквы и специальные символы.

  2. Минимальная длина пароля - 10, а максимальная длина - 32.

  3. То жесимвол не должен появляться последовательно 10 или более раз.

  4. Первый символ не может быть специальным символом.

  5. Требуется как минимум 2 класса символов.(буквы, цифры или специальные символы)

  6. Допускаются специальные символы - !#+,-./:=@_

Регулярное выражение, удовлетворяющее первым 4 условиям, кроме 5-го пункта:

^(?!.*(.)\1{7})[A-Za-z0-9][\w!#+,./:=@-]{7,23}

Как я могу проверить все политики вместе в Java?

Ответы [ 3 ]

1 голос
/ 22 апреля 2019

Лучший способ сделать это - не использовать регулярные выражения.

Подпрограмма с отдельными условиями гораздо легче читать и поддерживать:

sub is_password_valid {
    my ($pw) = @_;
    $pw =~ m{[^a-zA-Z0-9!\#+,\-./:=\@_]}
        and return 0;
    length($pw) >= 10 && length($pw) <= 32
        or return 0;
    $pw =~ /(.)\1{9}/s
        and return 0;
    $pw =~ /^[a-zA-Z0-9]/
        or return 0;
    ($pw =~ /[a-zA-Z]/ + $pw =~ /[0-9]/ + $pw =~ /[^a-zA-Z0-9]/) >= 2
        or return 0;
    return 1;
}

Или альтернативно, поскольку это в основном одно большое условие:

sub is_password_valid {
    my ($pw) = @_;
    return
        $pw !~ m{[^a-zA-Z0-9!\#+,\-./:=\@_]} &&
        length($pw) >= 10 &&
        length($pw) <= 32 &&
        $pw !~ /(.)\1{9}/s &&
        $pw =~ /^[a-zA-Z0-9]/ &&
        ($pw =~ /[a-zA-Z]/ + $pw =~ /[0-9]/ + $pw =~ /[^a-zA-Z0-9]/) >= 2
    ;
}

Если это не игрушечный валидатор для домашнего задания, вам следует изменить свои требования. Не имеет смысла "проверять" пароли с помощью регулярного выражения.

Вместо этого вам следует указать минимальную длину, намного большую максимальную длину (возможно, 255 символов или около того) и не ограничивать используемый набор символов.

Если вы хотите защитить от слабых паролей, проверьте против haveibeenpwned и дайте взломщику паролей (например, hashcat ) попробовать.

0 голосов
/ 26 апреля 2019

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

Преимущество, конечно, в том, что сообщения об ошибках могут быть представлены пользователю, чтобы точно определить, какие правила нарушены, если таковые имеются.

sub pwerr {
  local $_=pop;
  my $s='!#+,-./:=@_'; #allowed special chars
  grep $_,
  /^[a-z\d$s]+$/i        ? 0 : "Password must be just nums, letters and special chars $s",
  length()>=10           ? 0 : "Minimum length of the password is 10",
  length()<=32           ? 0 : "Maximum length of the password is 32",
  !/(.)\1{9}/            ? 0 : "Same char 10 or more in a row",
  /^[a-zA-Z0-9]/         ? 0 : "First character can not be special character",
  1</[a-z]/i+/\d/+/[$s]/ ? 0 : "At least 2 char classes of letters, numbers or special $s";
}

use strict; use warnings; use Test::More tests => 7;
sub _test_string { join("+",map{/^(\S+)/;$1}pwerr(shift()))||undef }
is(_test_string($$_[0]), $$_[1]) for map[split],grep/\w/,split/\n/,q(
1A!~                               Password+Minimum
abc                                Minimum+At
abcd12345-
abcd12345.
-abcd12345                         First
abcd4444444444                     Same
abcd12345.abcd12345.abcd12345.xyz  Maximum
);
0 голосов
/ 23 апреля 2019
print "Enter your password please: ";
$p=<STDIN>;chomp $p;

if ( $p =~ /(?!^[\s!#+,-./:=@_])(?=^[\w!#+,-./:=@]{10,32}$)(?=.*[A-Za-z])(?=.*[0-9])(?=.*[!#+,-./:=@_])(?!.*(.)\1{9,}).{10,32}/ ) {print "Welcome"; f=1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...