Generador de Password Aleatorios. ¿Código PHP Eficiente?

June 29, 07 by serumax

Hace 4 años hice este generador de claves random para lo que fue mi primer CMS:

$claves=array(“A”,”B”,”C”,”D”,”E”,”F”,”G”,”H”,”I”,”J”,”K”,”L”,”M”,”N”,”O”,”P”,”Q”,”R”,”S”,”T”,”U”,”V”,”W”,”X”,
“Y”,”Z”,”1″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9″,”0″);
$msje1 = $claves[rand(0,35)];
$msje2 = $claves[rand(0,35)];
$msje3 = $claves[rand(0,35)];
$msje4 = $claves[rand(0,35)];
$msje5 = $claves[rand(0,35)];
$msje6 = $claves[rand(0,35)];
$msje = $msje1.” “.$msje2.” “.$msje3.” “.$msje4.” “.$msje5.” “.$msje6;

El año pasados, evolucionó a esto:

$claves=array(“a”,”b”,”c”,”d”,”e”,”f”,”g”,”h”,”i”,”j”,”k”,”l”,”m”,”n”,”o”,”p”,”q”,”r”,”s”,”t”,”u”,”v”,”w”,”x”,”y”,”z”,”A”,
“B”,”C”,”D”,”E”,”F”,”G”,”H”,”I”,”J”,”K”,”L”,”M”,”N”,”O”,”P”,”Q”,”R”,”S”,”T”,”U”,”V”,”W”,”X”,”Y”,”Z”,”1″,”2″,”3″,”4″,
“5″,”6″,”7″,”8″,”9″,”0″);
$password=$claves[rand(0,62)].$claves[rand(0,62)].$claves[rand(0,62)].$claves[rand(0,62)].$claves[rand(0,62)].
$claves[rand(0,62)];
Y ahora lo he dejado en esto:

$claves = array_flip(array_merge(range(‘a’,'z’),range(‘A’,'Z’),range(0,9)));
$password = implode(“”,array_rand($claves, 6));

Y como no sabía qué tan eficiente era, ni qué tan bien escrito podía estar… me puse a buscar generadores de claves aleatorias en google:

En cristalab.com encontré esto:

$str = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890″;
$cad = “”;
for($i=0;$i<12;$i++) {
$cad .= substr($str,rand(0,62),1);
}
print $cad;

Bastante sencillo y muy similar a lo que yo tengo

En este blog
function make_seed() {
list($usec, $sec) = explode(‘ ‘, microtime());
return (float) $sec + ((float) $usec * 100000);
}

function randStr($long){ //largo de string random
$valuess=”abcdefghijklmnopqrstuvwxyz0123456789″;
$resultt=”";
mt_srand(make_seed());
for ($i=1; $i < = $long; $i++){
$resultt .= $valuess[mt_rand(0,strlen($valuess)-1)];
}
return $resultt;
}

Se complica un poco más y creo que está algo pasadito de moda. A partir de PHP 4.2.0, no es necesario inicializar el generador de números aleatorios con srand() ó mt_srand(),

En webnova

function f_genera_psw($num=8){ // By Kernellover
$voc = array (a,e,i,o,u);
$con = array (b,c,d,f,g,h,j,k,l,m,n,ñ,p,q,r,s,t,w,x,y,z);
$psw = ; // cadena que contendrá el password.
$vc = mt_rand(0,1); // definde si empieza por vocal o consonante.
for ($n=0; $n<$num; $n++){
if ($vc==1){
$vc=0;
$psw .= $con[mt_rand(0,count($con)-1)];
}
$psw .= $voc[mt_rand(0,count($voc)-1)];
$psw .= $con[mt_rand(0,count($con)-1)];
}
$psw = ereg_replace (q,qu,$psw);
$psw = ereg_replace (quu,que,$psw);
$psw = ereg_replace (yi,ya,$psw);
$psw = ereg_replace (iy,ay,$psw);
$psw = substr($psw,0,$num);
return $psw;
}
echo f_genera_psw(6);

Ya está mucho más complicado, pero tiene algunas opciones extras algo interesantes. De todas formas, usa mt_rand.

Y en tufuncion.com

function ae_gen_password($silabas= 3, $use_prefix = false){
// Definimos la función a menos de que esta exista
if (!function_exists(‘ae_arr’)){
// Esta función devuleve un elemento aleatorio
function ae_arr(&$arr){
return $arr[rand(0, sizeof($arr)-1)];
}
}

// Prefijos
$prefix = array(‘aero’, ‘anti’, ‘auto’, ‘bi’, ‘bio’,
‘cine’, ‘deca’, ‘demo’, ‘contra’, ‘eco’,
‘ergo’, ‘geo’, ‘hipo’, ‘cent’, ‘kilo’,
‘mega’, ‘tera’, ‘mini’, ‘nano’, ‘duo’);

// Sufijos
$suffix = array(‘on’, ‘ion’, ‘ancia’, ’sion’, ‘ia’,
‘dor’, ‘tor’, ’sor’, ‘cion’, ‘acia’);

// Sonidos
$vowels = array(‘a’, ‘o’, ‘e’, ‘i’, ‘u’, ‘ia’, ‘eo’);

// Consonantes
$consonants = array(‘r’, ‘t’, ‘p’, ’s’, ‘d’, ‘f’, ‘g’, ‘h’, ‘j’,
‘k’, ‘l’, ‘z’, ‘c’, ‘v’, ‘b’, ‘n’, ‘m’, ‘qu’);

$password = $use_prefix?ae_arr($prefix):”;
$password_suffix = ae_arr($suffix);

for($i=0; $i<$silabas; $i++)
{
// Selecciona una consonante al azar
$doubles = array(‘c’, ‘l’, ‘r’);
$c = ae_arr($consonants);
if (in_array($c, $doubles)&&($i!=0)) {
if (rand(0, 4) == 1) // 20% de probabiidad
$c .= $c;
}
$password .= $c;
//

// Seleccionamos un sonido al azar
$password .= ae_arr($vowels);
if ($i == $silabas – 1) // Si el sufijo empieza con vocal
if (in_array($password_suffix[0], $vowels)) // Añadimos una consonante
$password .= ae_arr($consonants);
}
// Seleccionamos un sufijo aleatorio
$password .= $password_suffix;
return $password;
}

Esta tiene opciones interesantes, sobre todo porque son contraseñas un poco más recordables que un random cualquiera. No obstante se complica mucho. Creo que mi solución es práctica y elegante.

Si alguien tiene una mejor opción, entonces que la comente.

Posts relacionados:

  1. Wordpress Theme Generator
  2. El código oculto de Wordpress

This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

Add your comment

3 responses for this post

  1. Password random en php | Viviendo en la era digital | La Web A Says:

    [...] Referencia Generador de Password Aleatorios [...]

  2. ELisa Says:

    Gracias! me ayudo :)

  3. Nadia Says:

    Excelente opción

Leave a Reply