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