password_bcrypt password online generar example desencriptar php random

online - password verify php



¿Cuál es la mejor manera de generar una clave aleatoria dentro de PHP? (8)

$ key = md5 (microtime (). rand ());

Microtime por sí solo no es seguro porque deja solo 1/1000 de posibilidades de ser adivinado.

Rand por sí mismo tampoco es muy seguro, pero al mezclarlos, se obtiene una aleatorización bastante sólida.

Estoy buscando crear una función reutilizable que genere una clave aleatoria con caracteres imprimibles ACSII de longitud elegida (entre 2 y 1000+). Creo que los caracteres ASCII imprimibles serían 33-126. La clave no necesita ser completamente única, solo única si se genera exactamente en el mismo milisegundo (por lo que uniqid() no funcionará).

Estoy pensando que una combinación de chr() y mt_rand() podría funcionar.

¿Es este el camino a seguir, o es otra cosa el mejor método?

Editar: uniqid() tampoco funcionará porque no tiene un parámetro de longitud, es simplemente lo que PHP le da.

Mi idea : esto es lo que se me ocurrió:

function GenerateKey($length = 16) { $key = ''''; for($i = 0; $i < $length; $i ++) { $key .= chr(mt_rand(33, 126)); } return $key; }

¿Hay algún problema con esto?

Otra Edición: la mayoría de las otras preguntas se refieren a la generación de contraseñas. Quiero una variedad más amplia de personajes y no me importa 1 vs l . Quiero que sea posible la cantidad máxima de claves posibles.

Nota: la clave generada no tiene necesariamente que ser criptográficamente segura.



¿Te interesaría esa pregunta ?

No estoy seguro de por qué uniqid() no funciona para usted y en uniqid() caso necesita un número único en el mismo milisegundo, pero no necesariamente lo contrario; ¿Qué estás generando tan rápido que en el mismo milisegundo podrías tener una colisión? Me pregunto cuánto tiempo toma uniqid() solo para generar su número. Si lo desea, use el parámetro de prefijo de la función uniqid() con algunas letras aleatorias y debe estar seguro.

Si es para generar archivos, es posible que desee ver tmpfile() o tempname() .

En cualquier caso, dependiendo de lo que esté tratando de lograr, puede hacer un bucle y verificar si el ID único ya está tomado (en una matriz, con file_exists, etc.) y simplemente generar otro si es el caso.

Además, como no estoy seguro de entender tu pregunta exactamente, te señalaría aquellas otras preguntas que suenan bastante similares mientras obtengo la diferencia tuya:

El primero será de interés si está buscando hacer una identificación única que sea legible por humanos. El segundo podría ser útil si quieres jugar con números aleatorios y md5 / sha1. Aunque, de nuevo, creo que uniqid() podría ser lo que estás buscando.


Mi respuesta anterior tomó un hash de uniqid () combinado con una sal derivada de las variables del sistema, pero eso no genera una clave aleatoria , solo una que es altamente probable que sea única. Del mismo modo, la salida de rand () o mt_rand () no es lo suficientemente aleatoria para fines criptográficos.

Para generar una clave aleatoria, necesita ir a un buen origen de datos aleatorios, y la función openssl_random_pseudo_bytes() está diseñada para hacer eso:

$randkey = base64_encode(openssl_random_pseudo_bytes(32));

El base64_encode () es para convertirlo en caracteres imprimibles.

La razón por la que las otras respuestas no recomiendan openssl_random_pseudo_bytes () es probablemente que se introdujo en PHP 5.3, y esta pregunta tiene casi 6 años.


Ninguna de las respuestas aquí es suficiente si quieres aleatoriedad de fuerza criptográfica (¿hay un atacante determinado intentando adivinar cuáles son tus claves aleatorias?). Si el tiempo no es seguro, un atacante puede acelerar su búsqueda adivinando el momento en que cree que su servidor generó la clave, y es fácil buscar durante todos los milisegundos en un año determinado, incluso en una computadora portátil de consumo (es un 35 poco espacio de búsqueda). Además, la sugerencia de simplemente ejecutar los resultados de uniqid() u otra fuente aleatoria débil a través de una función hash para "expandirla" es peligrosa; esto no dificulta la búsqueda de un atacante una vez que descubren que lo hiciste.

Si realmente necesita seguridad criptográfica, debe leer de / dev / random, el siguiente código debería funcionar para usted en cualquier sistema compatible con POSIX (cualquier cosa que no sea Windows):

#Generate a random key from /dev/random function get_key($bit_length = 128){ $fp = @fopen(''/dev/random'',''rb''); if ($fp !== FALSE) { $key = substr(base64_encode(@fread($fp,($bit_length + 7) / 8)), 0, (($bit_length + 5) / 6) - 2); @fclose($fp); return $key; } return null; }

Si necesita un poco más de velocidad, puede leer de ''dev / urandom'' en su lugar.


También puede generar una clave aleatoria y verificar la clave en su DB si la clave se cierra, puede generar otra clave con este método

function activation($lengt=20){ $modalpage =new Modal;//you can call your modal page and check the key $characters = "1234567890abcdefghijklmnopqrstuvwxyz"; for($i=0;$i<$lengt;$i++) { $key .= $characters{rand(0,35)}; $check= array( ":key" => $key, ); $result = $modalpage->findkey($check); if($result==true){ //if the key is exits return the function and generate another key ! return activation($lengt); }else //if the key is not exits return the key return $key; } } $mykey=activation(15);


Todavía puede usar uniqid (), solo haga un procesamiento adicional para expandir su valor al número de caracteres que necesita.

Por ejemplo, para expandirlo a 32 caracteres, podrías hacer

$id = md5(uniqid());

Para expandirlo a 64 caracteres, solo agregue el md5 del md5, como tal

$first = md5(uniqid()); $id = $first . md5($first);

Luego, haga el truqueo según sea necesario, si necesita menos de un múltiplo de 32.

Es posible que te encuentres con colisiones, pero es bastante improbable. Si eres paranoico al respecto, solo utiliza la misma idea, pero uniqid() través de un cifrado simétrico como AES en lugar de hash.


Actualización (12/2015): para PHP 7.0, debe usar random_int() lugar de mt_rand ya que proporciona "valores criptográficamente seguros"

Personalmente, me gusta usar sha1(microtime(true).mt_rand(10000,90000)) pero está buscando más de un enfoque personalizable, así que pruebe esta función (que es una modificación de su solicitud de esta respuesta ):

function rand_char($length) { $random = ''''; for ($i = 0; $i < $length; $i++) { $random .= chr(mt_rand(33, 126)); } return $random; }

Aún así, esto probablemente será significativamente más lento que uniqid (), md5 () o sha1 ().

Editar: Parece que llegaste primero, lo siento. :RE

Edición 2: decidí hacer una pequeña prueba en mi máquina Debian con PHP 5 y eAccelerator (perdonad el código largo):

function rand_char($length) { $random = ''''; for ($i = 0; $i < $length; $i++) { $random .= chr(mt_rand(33, 126)); } return $random; } function rand_sha1($length) { $max = ceil($length / 40); $random = ''''; for ($i = 0; $i < $max; $i ++) { $random .= sha1(microtime(true).mt_rand(10000,90000)); } return substr($random, 0, $length); } function rand_md5($length) { $max = ceil($length / 32); $random = ''''; for ($i = 0; $i < $max; $i ++) { $random .= md5(microtime(true).mt_rand(10000,90000)); } return substr($random, 0, $length); } $a = microtime(true); for ($x = 0; $x < 1000; $x++) $temp = rand_char(1000); echo "Rand:/t".(microtime(true) - $a)."/n"; $a = microtime(true); for ($x = 0; $x < 1000; $x++) $temp = rand_sha1(1000); echo "SHA-1:/t".(microtime(true) - $a)."/n"; $a = microtime(true); for ($x = 0; $x < 1000; $x++) $temp = rand_md5(1000); echo "MD5:/t".(microtime(true) - $a)."/n";

Resultados:

Rand: 2.09621596336 SHA-1: 0.611464977264 MD5: 0.618473052979

Así que mi sugerencia, si quieres velocidad (pero no juego de caracteres completo), es apegarte a MD5, SHA-1 o Uniqid (que aún no he probado ...)