用Perl生成随机密码


在运维日常工作中,需要定期修改机器的密码,密码尽量规范一些,不要包含那些特殊字符,以便一些脚本在使用到它们时不会出错。
使用模块来实现
String::MkPasswd模块
String::MkPasswd模块提供了一个简单的API,用来随机生成不可拼读的密码。要在Perl里使用它,就要进行下面这些步骤:
需要从cpan上安装这个模块,具体安装方法参考此处。
在编写代码之前,你必须确定密码的一些重要属性。String::MkPasswd让你可以控制:
* 密码的长度;
* 数字的数量;
* 大写和小写字符的数量;
* 特殊标点符号的数量;
在大多数情况下,你希望密码有8到15个字符长,而且希望一般的字符中间还包含相当的数字和特殊字符。要记住的是,密码越随机,它就越难被破解!
一旦确定密码需要是什么样的,你就可以调用String::MkPasswd模块的mkpasswd()函数来生成密码:
#!/usr/bin/perl
use String::MkPasswdqw(mkpasswd);
# print custom password
print mkpasswd(-length => 13, -minnum => 4, -minlower => 4, -minupper => 2, -minspecial => 3);
在本文里,所生成的密码有13个字符长,其中包括4个数字、4个小写字符、2个大写字符和3个标点。
每次调用mkpasswd()的时侯,你会得到一个不同的结果。所以如果有大量的密码要生成,你可以就把对mkpasswd()的调用放到一个循环里,并处理每次运行的结果。
提示:如果这看起来太麻烦,你还可以不使用任何参数就调用mkpasswd()生成一个默认的9位数的密码。
Crypt::RandPasswd模块
String::MkPasswd模块可以生成很安全但是非常难以记住的密码。如果你更希望生成可以拼读和容易记忆的密码,那就考虑Crypt::RandPasswd模块吧。这个模块是自动密码生成器(Automated Password Generator)的一个实现,你可以用下面的步骤来使用它:
Crypt::RandPasswd模块带有一个word()函数,用来生成可拼读的随机密码:
#!/bin/perl
# use module
use Crypt::RandPasswd;
# generate password
$word = Crypt::RandPasswd->word(5, 10);
print $word;
word()函数接受两个自变量:密码长度的上限和下限。
提示:通过调用letters()方法你可以生成一个含有一串随机字母字符的密码,而不需要使用words()方法。用这两个模块中的任何一个都可以提高你网络系统的安全性……那么你还等什么呢?
使用自定义函数来实现
主要还是借用'rand'函数来实现。
$random = int( rand( $Y-$X+1 ) ) + $X;
下面的示例将会输出25-75之间的随机数:
$random = int( rand(51)) + 25;
print "$random\n";
从数组中随机返回元素
$elt = $array[ rand @array ];
$elt = $array[ int( rand(0+@array) ) ];
生成8位包含特殊的随机密码
@chars = ( "A" .. "Z", "a" .. "z", 0 .. 9, qw(! @ $ % ^ & *) );
$password = join("", @chars[ map { rand @chars } ( 1 .. 8 ) ]);
sub random_pwd {
my $length = shift;
my @chars = (0 .. 9, 'a' .. 'z', 'A' .. 'Z');
return join '', @chars[ map rand @chars, 0 .. $length ];
}
print random_pwd(42);
将生成42位长度的密码。
my @chars=("a".."z",0..9);
my $password="";
foreach(1..42){
my $char=$chars[int(rand(@chars))];
$char=uc($char) if rand() <0.5;
$password.=$char;
}
print $password . "\n";
-------------------------------
my @chars = ('0'..'9', 'a'..'z', 'A'..'Z');
my $passwd =
join '',map $chars[rand(@chars)],1..42;
使用perl in one line来完成:
perl -le "print map { ('a'..'z', 'A'..'Z', '0'..'9')[rand 62] } 1..42"
perl -le 'print map { ("a".."z")[rand 26] } 1..8'
perl -le 'print map { ("a".."z", 0..9)[rand 36] } 1..8'
perl -le 'print map { (q(a)..q(z))[rand(26)] } 1 .. 10'
使用模块来实现
String::MkPasswd模块
String::MkPasswd模块提供了一个简单的API,用来随机生成不可拼读的密码。要在Perl里使用它,就要进行下面这些步骤:
需要从cpan上安装这个模块,具体安装方法参考此处。
在编写代码之前,你必须确定密码的一些重要属性。String::MkPasswd让你可以控制:
* 密码的长度;
* 数字的数量;
* 大写和小写字符的数量;
* 特殊标点符号的数量;
在大多数情况下,你希望密码有8到15个字符长,而且希望一般的字符中间还包含相当的数字和特殊字符。要记住的是,密码越随机,它就越难被破解!
一旦确定密码需要是什么样的,你就可以调用String::MkPasswd模块的mkpasswd()函数来生成密码:
#!/usr/bin/perl
use String::MkPasswdqw(mkpasswd);
# print custom password
print mkpasswd(-length => 13, -minnum => 4, -minlower => 4, -minupper => 2, -minspecial => 3);
在本文里,所生成的密码有13个字符长,其中包括4个数字、4个小写字符、2个大写字符和3个标点。
每次调用mkpasswd()的时侯,你会得到一个不同的结果。所以如果有大量的密码要生成,你可以就把对mkpasswd()的调用放到一个循环里,并处理每次运行的结果。
提示:如果这看起来太麻烦,你还可以不使用任何参数就调用mkpasswd()生成一个默认的9位数的密码。
Crypt::RandPasswd模块
String::MkPasswd模块可以生成很安全但是非常难以记住的密码。如果你更希望生成可以拼读和容易记忆的密码,那就考虑Crypt::RandPasswd模块吧。这个模块是自动密码生成器(Automated Password Generator)的一个实现,你可以用下面的步骤来使用它:
Crypt::RandPasswd模块带有一个word()函数,用来生成可拼读的随机密码:
#!/bin/perl
# use module
use Crypt::RandPasswd;
# generate password
$word = Crypt::RandPasswd->word(5, 10);
print $word;
word()函数接受两个自变量:密码长度的上限和下限。
提示:通过调用letters()方法你可以生成一个含有一串随机字母字符的密码,而不需要使用words()方法。用这两个模块中的任何一个都可以提高你网络系统的安全性……那么你还等什么呢?
使用自定义函数来实现
主要还是借用'rand'函数来实现。
$random = int( rand( $Y-$X+1 ) ) + $X;
下面的示例将会输出25-75之间的随机数:
$random = int( rand(51)) + 25;
print "$random\n";
从数组中随机返回元素
$elt = $array[ rand @array ];
$elt = $array[ int( rand(0+@array) ) ];
生成8位包含特殊的随机密码
@chars = ( "A" .. "Z", "a" .. "z", 0 .. 9, qw(! @ $ % ^ & *) );
$password = join("", @chars[ map { rand @chars } ( 1 .. 8 ) ]);
sub random_pwd {
my $length = shift;
my @chars = (0 .. 9, 'a' .. 'z', 'A' .. 'Z');
return join '', @chars[ map rand @chars, 0 .. $length ];
}
print random_pwd(42);
将生成42位长度的密码。
my @chars=("a".."z",0..9);
my $password="";
foreach(1..42){
my $char=$chars[int(rand(@chars))];
$char=uc($char) if rand() <0.5;
$password.=$char;
}
print $password . "\n";
-------------------------------
my @chars = ('0'..'9', 'a'..'z', 'A'..'Z');
my $passwd =
join '',map $chars[rand(@chars)],1..42;
使用perl in one line来完成:
perl -le "print map { ('a'..'z', 'A'..'Z', '0'..'9')[rand 62] } 1..42"
perl -le 'print map { ("a".."z")[rand 26] } 1..8'
perl -le 'print map { ("a".."z", 0..9)[rand 36] } 1..8'
perl -le 'print map { (q(a)..q(z))[rand(26)] } 1 .. 10'