Generador de Password Aleatorios. ¿Código PHP Eficiente?
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.
[...] Referencia Generador de Password Aleatorios [...]