- !/usr/bin/perl
- ==============================================================================
- Name : random_password.pl
- Description : Generates a random password according to specific rules
-
- Notes : none
-
- Modification History
- ====================
- When Who What
- ========= ================= ==================================================
- 16-APR-13 Stuart Barkley Created
- ==============================================================================
$DEBUG=0;
my $password=//;
my $RULES_PASSED=0;
sub debug {
my $msg = $_[[0]];
$DEBUG && print $msg;
}
- -------------------
- Generate a password
- -------------------
sub generate_password {
my ($pwlen) = @_;
return `head /dev/urandom | uuencode -m - | sed -n 2p | cut -c1-\\${pwlen:-12};`
}
while (! $RULES_PASSED) {
$password=generate_password;
chomp($password);
# --------------------
# Apply business rules
# --------------------
#1. Has to start and end with an alphabetic character
if ($password !~ m/^[[A-z]].*[[A-z]]$/) {
debug "$password failed rule 1\
";
next;
}
#2. Has to contain at least 2 upper case characters
if ($password !~ m/[[A-Z]].*[[A-Z]]/) {
debug "$password failed rule 2\
";
next;
}
#3. Has to contain at least 2 lower case characters
if ($password !~ m/[[a-z]].*[[a-z]]/) {
debug "$password failed rule 3\
";
next;
}
#4. Has to contain at least 2 digits
if ($password !~ m/\\d.*\\d/) {
debug "$password failed rule 4\
";
next;
}
#5. Has to contain between 10 and 12 characters
if ($password !~ m/.{10,12}/) {
debug "$password failed rule 5\
";
next;
}
# -----------------
# Apply other rules
# -----------------
#6. Has to contain only printable characters
if ($password !~ m/[[ -~]]/) {
debug "$password failed rule 6\
";
next;
}
#7. Cannot contain certain special characters
if ($password =~ m|[[\\/\\&\\*\\$]]|) {
debug "$password failed rule 7\
";
next;
}
$RULES_PASSED=1;
}
print $password;