Date: Fri, 20 Nov 1998 18:50:11 -0500 From: "Allen Smith" <easmith@beatrice.rutgers.edu> To: dannyman <dannyman@dannyland.org>, ee123@rocketmail.com, freebsd-hackers@FreeBSD.ORG Subject: Re: Password generator Message-ID: <9811201850.ZM5103@beatrice.rutgers.edu> In-Reply-To: dannyman <dannyman@dannyland.org> "Re: Password generator" (Nov 20, 6:21pm) References: <19981120163916.17293.rocketmail@web1.rocketmail.com> <19981120171714.P14320@enteract.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Nov 20, 6:21pm, dannyman (possibly) wrote:
> On Fri, Nov 20, 1998 at 08:39:16AM -0800, EE wrote:
> > Hy,
> > I'm looking for a password generator.
> > Does anybody know where I can found one?
>
> Perl code snippet:
>
> sub get_password {
> my @ary = ( 0 .. 9, 'A' .. 'Z', 'a' .. 'z', 'z', '!', '$', '%');
> my $password;
> my $pw_len = rand(5)+6;
> for(1..$pw_len) {
> $password .= $ary[rand(@ary)];
> }
> return $password;
> }
>
> This is actually a labotomised function call that's part of a script I wrote
> to add users to our system. It generates a random password if the user
> doesn't supply one.
IIRC, the original requestor was wanting one that would produce
_pronouceable_ passwords. I don't have one, but the following is an
improved version of the above (written for about the same purpose):
use MD5;
sub makepass
{
my($string,$stringinit,$tmpfile) = ('','','');
unless (defined($tmpdir) && (-w $tmpdir) && (-d $tmpdir))
{
$tmpdir = &tmpdir();
}
my($string2) = '';
while (length($string) < 8)
{
until (($tmpfile ne '') && (-e $tmpfile) && ($? == 0))
{
while (($tmpfile eq "") || (-e $tmpfile))
{
$tmpfile = $tmpdir . "/" . "randpass" . int(rand(10000));
}
`$pgp +makerandom=48 $tmpfile >/dev/null 2>/dev/null`;
if (($? != 0) && (-e $tmpfile))
{
unlink $tmpfile;
}
}
open(PGP, $tmpfile) || (die "Can't open $tmpfile: $!\n");
unlink $tmpfile;
$context = new MD5;
$context->reset();
$context->addfile(PGP);
$stringinit = $context->digest();
$stringinit = substr($stringinit,0,int(length($stringinit)/2)) ^
substr($stringinit,int(length($stringinit)/2),length($stringinit));
if (length($string2) > 0)
{
foreach $character1 (split(/.*/,$string2))
{
my($new_stringinit) = '';
foreach $character2 (split(/.*/,$stringinit))
{
$new_stringinit .= $character1 ^ $character2;
}
$stringinit = $new_stringinit;
}
$string2 = '';
}
for ($i = 0; $i <= length($stringinit); $i++)
{
my($stringchar) = ord(substr($stringinit,$i,1));
if ($stringchar > 94) # 188 = int (2**8 / 94) * 94; by Peter da Silva
{
$string2 .= substr($stringinit,$i,1);
}
else
{
$stringchar = ($stringchar % 94) + 33;
$string .= chr($stringchar);
}
}
$string2 .= $string;
$string =~ tr/-a-zA-Z2-9=[]\\;,.\/~!@\#$%^&*()+{}|:""<>?//cd;
$string2 =~ tr/-a-zA-Z2-9=[]\\;,.\/~!@\#$%^&*()+{}|:""<>?//d;
}
if (length($string . $string2) > 8)
{
my($number) = rand(32768);
foreach $character (split(/.*/,substr(($string . $string2),8)))
{
$number ^= ord($character);
}
srand($number); # yes, this may very well call srand multiple times... one reason for inc rand in it
}
close PGP;
return substr($string,0,8);
}
You'll need to put in a new way to get a secure temporary directory
(&tmpdir()) calls a perl module that I'm still working on getting into
publishable form) and have a copy of pgp around (and with $pgp
equalling its location).
-Allen
--
Allen Smith easmith@beatrice.rutgers.edu
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9811201850.ZM5103>
