使用正则表达式验证密码

时间:2019-04-22 08:12:50

标签: regex perl

我正在编写正则表达式以验证密码。

下面是我要介绍的密码策略:

  1. 密码只能包含数字,字母和特殊字符。

  2. 密码的最小长度为10,密码的最大长度为32。

  3. 同一字符不应连续出现10次以上。

  4. 第一个字符不能为特殊字符。

  5. 至少需要2个字符类。(字母,数字或特殊字符)

  6. 允许使用特殊字符-!#+,-./:=@_

除第五点外,将满足前四个条件的正则表达式:

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

我如何在Java中一起验证所有策略?

3 个答案:

答案 0 :(得分:1)

做到这一点的最好方法是不使用正则表达式。

具有单独条件的子例程更易于阅读和维护:

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)解决。

答案 1 :(得分:0)

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}

答案 2 :(得分:0)

相反,创建相反的子目录可以返回零个或多个错误消息,而不是创建返回有效密码为true的子目录。

当然,这样做的好处是可以将错误消息呈现给用户,以准确指出违反了哪些规则。

addOne = (data) => {
  let sum = 0, digit = data.length - 1
  data.forEach(n => sum += n * (10 ** digit--))
  return (sum + 1).toString().split("")
}
console.log(addOne([1,8,9]))
console.log(addOne([1,2,3,9,1]))
console.log(addOne([5,7,9,9]))