Generador de Passwords

Horst von Brand vonbrand en inf.utfsm.cl
Sab Jul 8 23:59:22 CLT 2006


Alvaro Herrera <alvherre en alvh.no-ip.org> wrote:
> Luis Vivero escribió:
> > Hola,
> > 
> > Ando buscando un generador de passwords seguras, porque pierdo tiempo en
> > pensar 'a ver que password sera segura...mmm...'
> 
> Yo escribi esto hace años y todavia lo uso.  Genera password
> semi-silabicas, que son mas faciles de recordar que las passwords
> realmente aleatorias.  Hasta el momento no he generado ninguna password
> que haya podido quebrar en tiempo razonable con John the Ripper (claro
> que no me he vuelto loco probando)
> 
> -- 
> Alvaro Herrera       Valdivia, Chile   ICBM: S 39º 49' 18.1", W 73º 13' 56.4"
> "Investigación es lo que hago cuando no sé lo que estoy haciendo"
> (Wernher von Braun)

Algunas criticas...

> #!/usr/bin/perl -w
> # Genera passwords.
> # Por defecto, tres passwords de largo 12.

Porque no "numero de silabas"?

> #
> # Opciones:
> # -p hace que excluya simbolos de puntuacion.
> # -n <num> define la cantidad de passwords
> # -l <num> define el largo de las passwords.
> # "cr" indica que las entregue encriptadas _ademas_ de la version plana
> #   (suele no servir para nada)
> 
> $punt = 1;
> 
> while ($_ = shift @ARGV) {
> 	if (/^cr$/) {
> 		$cr=1;
> 	} elsif (/^-n$/ && ($_ = shift @ARGV) && /^(\d+)$/) {
> 		$cnt=$1;
> 	} elsif (/^-l$/ && ($_ = shift @ARGV) && /^(\d+)$/) {
> 		$maxlen=$1;
> 	} elsif (/^-p$/) {
> 		$punt = 0;
> 	}
> }
> 
> srand (time ^ $$ ^ unpack "%L*", `ps -fea | gzip`);

No es muy sano... mejor lee de /dev/random (o /dev/urandom). Y no uses rand(3).

> # Por defecto, tres passwords de largo 12.
> $cnt=3 unless (defined($cnt));
> $maxlen=12 unless (defined($maxlen));
> 
> @VOC=qw(a e i o u y);
> @CON=qw(b c d f g h j k l m n p qu r s t v ch gl gr pr pl);
> @PUNT=qw(! @ $ % ^ & * - + ~ - = [ ] | ; : < . > / ?);
> 
> $num=0;
> foreach $i (@CON) {
> 	for $j (@VOC) {
> 		push @lista, $i.$j;
> 		$num++;
> 	}
> }

Hummm... por mi lado, elegiria al azar al combinar, no crear tanto de
antemano para luego descartar la mayor parte del trabajo.

> $cant = $num/30;
> for $i (0 .. 9) {
> 	for (1 .. $cant) {
> 		push @lista, $i;
> 	}
> }
> if ($punt) {
> 	foreach (@PUNT) {
> 		push @lista, $_;
> 	}
> }
> 
> for $i (0 .. $cnt-1) {
> 	$passwd="";
> 	while (length($passwd)<$maxlen) {
> 		$mas=$lista[rand $#lista];
> 		$mas=((rand()>0.6) ? ucfirst($mas) : $mas);
> 		$passwd .= $mas;
> 	}
> 
> 	$passwd=substr($passwd,0,$maxlen);
> 	if ($cr) {
> 		$salt = join '', ('A'..'Z','a'..'z',0..9,'.','/')[rand 64, rand 64];
> 		$crypted = crypt($passwd, $salt);
> 		$passwd.=":$crypted";
> 	}
> 	print "$passwd\n";
> }

Buena idea, en general!
-- 
Dr. Horst H. von Brand                   User #22616 counter.li.org
Departamento de Informatica                     Fono: +56 32 654431
Universidad Tecnica Federico Santa Maria              +56 32 654239
Casilla 110-V, Valparaiso, Chile                Fax:  +56 32 797513


Más información sobre la lista de distribución Linux