Getting Passwords from Random Data (portably!)
Over at Mark Kolich’s blog, he wrote several months ago about using a source of randomness (/dev/urandom) to generate passwords. The idea is simple enough: take the random data, strip out only the printable characters, and then print the desired length of characters for a password.
Shortly thereafter, he described how to use a simple shell script to generate many passwords – such as for setting up many different accounts.
Working with HP-UX and OpenVMS as I do, I immediately thought: how could I do this in Perl, making the idea portable and making a program that will work on both UNIX and OpenVMS? It was easy – and easy to make it flexible as well. Here is the program that I came up with:
#!/usr/bin/perl
# code released by David Douthitt into the public domain
use Getopt::Long;
Getopt::Long::Configure('bundling');
GetOptions( 'l=i' => \$opt_l,
'p=s' => \$opt_p,
'm=i' => \$opt_m );
$pat{"ext"} = "[[:alnum:][:punct:]]";
$pat{"alnum"} = "[[:alnum:]]";
$pat{"alpha"} = "[[:alpha:]]";
$pat{"simple"} = "[a-km-z2-9]";
$pat{"normal"} = "[a-km-z2-9A-HJ-NPR-Z]";
if (defined($opt_p)) {
if (defined($pat{$opt_p})) {
$pat = $pat{$opt_p};
} else {
print "undefined pattern!\n";
exit(1);
}
} else {
$pat = $pat{"normal"};
}
$max = (defined($opt_m) ? $opt_m : 1000);
$len = (defined($opt_l) ? $opt_l : 6);
$x = $len;
for $i (0..$max) {
$c = chr(int(rand(255)));
if ($c =~ /$pat/o) {
$s .= $c;
if (--$x == 0) {
print "$s\n";
$x = $len;
$s = "";
}
}
}
Note that since OpenVMS does not use the “#!” notation, that this line will be ignored as a comment and the program needs to be invoked via direct invocation of perl itself.
As an aside, Mark says how he prefers random passwords. Me, I prefer “pronouncable” passwords – still random, but using phoenemes which makes the generation process just that more complicated – and complicates internationalization. Apple’s MacOS X comes with a password generator that can generate random and pronouncable passwords.
However, with the proper password storage system a fully randomized password is good – or is it? A completely random password of eight characters could be zzzzzzzz as much as anything else. Perhaps a password with a random distribution of characters (rather than a random selection of characters) would be better. I’m not aware of any password generators that guarantee a random distribution instead of a random collection.
Powered by ScribeFire.



Recent Comments