Estoy tratando de crear una cadena aleatoria en PHP, y no obtengo absolutamente ningún resultado con esto:
<?php
function RandomString()
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring = $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
¿Qué estoy haciendo mal?
strlen($characters)
=>strlen($characters) - 1
- la longitud de la cadena comienza con 1Respuestas:
Para responder esta pregunta específicamente, dos problemas:
$randstring
no está dentro del alcance cuando lo repites.Aquí hay un fragmento de código con las correcciones:
Salida de la cadena aleatoria con la siguiente llamada:
fuente
substr(str_shuffle(MD5(microtime())), 0, 10);
?rand()
amt_rand()
. Usé tu método y experimenté un montón de colisiones con nombres.Una forma mas.
ACTUALIZADO (ahora esto genera cualquier longitud de cadena):
Eso es. :)
fuente
Hay muchas respuestas a esta pregunta, pero ninguna de ellas aprovecha un generador de números pseudoaleatorios criptográficamente seguros (CSPRNG).
La respuesta simple, segura y correcta es usar RandomLib y no reinventar la rueda.
Para aquellos de ustedes que insisten en inventar su propia solución, PHP 7.0.0 proporcionará
random_int()
para este propósito; si todavía está en PHP 5.x, escribimos un polyfill de PHP 5 pararandom_int()
que pueda usar la nueva API incluso antes de actualizar a PHP 7.La generación segura de enteros aleatorios en PHP no es una tarea trivial. Siempre debe consultar con sus expertos en criptografía StackExchange residentes antes de implementar un algoritmo interno en producción.
Con un generador entero seguro en su lugar, generar una cadena aleatoria con un CSPRNG es un paseo por el parque.
Crear una cadena segura y aleatoria
Uso :
Demostración : https://3v4l.org/IMJGF (ignore las fallas de PHP 5; necesita random_compat)
fuente
$keyspace = str_shuffle($keyspace );
para más seguridadrandom_int()
lugar derand()
omt_rand()
no agrega complejidad para el desarrollador. Al mismo tiempo, les da mayor seguridad. Las personas que vienen a StackOverflow en busca de soluciones rápidas pueden no saber si lo que están construyendo necesita ser seguro o no. Si les damos respuestas seguras por defecto, crean una Internet más segura incluso si, desde su perspectiva, es totalmente accidental. Por qué te opondrías a este objetivo es un misterio para mí.Esto crea una cadena hexadecimal de 20 caracteres de longitud:
En PHP 7 ( random_bytes () ):
fuente
openssl_random_pseudo_bytes()
no utilizó un algoritmo criptográficamente fuerte hasta php 5.6. Erroropenssl_random_pseudo_bytes()
, no obtendrá nada. Además, tenga en cuenta que al usarlobin2hex(openssl_random_pseudo_bytes($length / 2))
ya que está trabajando con enteros, eliminará automáticamente el módulo y usará el siguiente múltiplo más bajo de 2. Por lo tanto,$length = 19
producirá una cadena de longitud 18.fgets($fp, 1024)
y cada editor de archivos que tiene problemas con las líneas muy largas:function string_rand($len, $split="\n") { return substr(chunk_split(bin2hex(openssl_random_pseudo_bytes(ceil($len / 2))), 1023, $split), 0, $len); }
Conjunto$split
denull
si se debe devolver una sola línea. Por eso puedes usarlo en ambos casos.$string = substr(base64_encode(random_bytes($size)), 0, $size);
@tasmaniski: tu respuesta funcionó para mí. Tuve el mismo problema y lo sugeriría para aquellos que alguna vez buscan la misma respuesta. Aquí es de @tasmaniski:
Aquí hay un video de YouTube que nos muestra cómo crear un número aleatorio
fuente
md5
dará como resultado un límite de 30 caracteres y siempre caracteres en minúsculas.md5(rand())
solo ofrece 2 ^ 32 valores posibles. Esto significa que después de, en promedio, 2 ^ 16 cadenas aleatorias, esperará que se repita una.Dependiendo de su aplicación (quería generar contraseñas), podría usar
Al ser base64, pueden contener
=
o-
los caracteres solicitados. Puede generar una cadena más larga, luego filtrarla y recortarla para eliminarlas.openssl_random_pseudo_bytes
parece ser la forma recomendada de generar un número aleatorio adecuado en php. ¿rand
Por qué no usa/dev/random
? No lo sé.fuente
openssl_random_pseudo_bytes()
es portátil.Aquí hay una línea simple que genera una verdadera cadena aleatoria sin ningún ciclo de secuencia de comandos o uso de bibliotecas OpenSSL.
Desglosarlo para que los parámetros estén claros
Este método funciona repitiendo aleatoriamente la lista de caracteres, luego baraja la cadena combinada y devuelve el número de caracteres especificado.
Puede aleatorizar aún más esto, aleatorizando la longitud de la cadena devuelta, reemplazándola
$chrRandomLength
pormt_rand(8, 15)
(para una cadena aleatoria de entre 8 y 15 caracteres).fuente
$chrRepeatMax
y$chrRepeatMin
), por lo que una cadena de 10 caracteres podría (improbable, pero posible) ser "aaaaaaaaaa".Tada!
fuente
sha1
dará como resultado un límite de 40 caracteres y siempre caracteres en minúsculas.rant()
ser aleatorio no importa cuando sha no está distribuido de manera uniforme. Si selecciona aleatoriamente de una distribución desigual, obtendrá exactamente la misma distribución desigual. No estoy resaltando la aleatoriedad del "nivel de cifrado", si ese fuera el caso, tampoco deberías estar usandorand()
. Se requiere un esfuerzo mínimo para obtener una distribución uniforme, como en la respuesta aceptada, y es tan aleatorio como rand (), que es razonable.Una mejor manera de implementar esta función es:
mt_rand
es más aleatorio de acuerdo con esto y esto en PHP 7. Larand
función es un alias demt_rand
.fuente
mt_rand
no genera valores criptográficamente seguros. Para eso deberías usar PHP7'srandom_int
orandom_bytes
.$randstring
en el ámbito de la función no es lo mismo que el ámbito donde lo llama. Debe asignar el valor de retorno a una variable.O simplemente haga eco directamente del valor de retorno:
Además, en su función tiene un pequeño error. Dentro del ciclo for, debe usarlo
.=
para que cada carácter se agregue a la cadena. Al usarlo,=
lo sobrescribe con cada nuevo carácter en lugar de agregarlo.fuente
Primero, define el alfabeto que desea usar:
Luego, use
openssl_random_pseudo_bytes()
para generar datos aleatorios adecuados:Finalmente, utiliza estos datos aleatorios para crear la contraseña. Debido a que cada carácter
$random
puede serchr(0)
hastachr(255)
, el código usa el resto después de la división de su valor ordinal$alphabet_length
para asegurarse de que solo se seleccionen los caracteres del alfabeto (tenga en cuenta que al hacerlo sesga la aleatoriedad):Alternativamente, y en general mejor, es usar RandomLib y SecurityLib :
fuente
%
producirá una salida sesgada. Sin embargo, fuerte +1 para RandomLib. No reinventes la rueda.Métodos cortos.
Estos son algunos de los métodos más cortos para generar la cadena aleatoria.
fuente
He probado el rendimiento de las funciones más populares allí, el tiempo necesario para generar 1'000'000 cadenas de 32 símbolos en mi caja es:
Tenga en cuenta que no es importante cuánto tiempo fue realmente, sino cuál es más lento y cuál es más rápido, por lo que puede seleccionar de acuerdo con sus requisitos, incluida la preparación de criptografía, etc.
Se agregó substr () alrededor de MD5 en aras de la precisión si necesita una cadena que sea más corta que 32 símbolos.
En aras de la respuesta: la cadena no se concatenó sino que se sobrescribió y el resultado de la función no se almacenó.
fuente
PHP 7+ Genera bytes aleatorios criptográficamente seguros utilizando la función random_bytes .
Salida posible
PHP 5.3+ Genera bytes pseudoaleatorios usando la función openssl_random_pseudo_bytes .
Salida posible
El mejor caso de uso podría ser
Salida posible
fuente
Una forma muy rápida es hacer algo como:
Esto generará una cadena aleatoria con la longitud de 10 caracteres. Por supuesto, algunos podrían decir que es un poco más pesado en el lado de la computación, pero hoy en día los procesadores están optimizados para ejecutar el algoritmo md5 o sha256 muy rápidamente. Y, por supuesto, si la
rand()
función devuelve el mismo valor, el resultado será el mismo, con una probabilidad de 1/32767 de ser el mismo. Si la seguridad es el problema, simplemente cambierand()
amt_rand()
fuente
fuente
Este fue tomado de fuentes administrativas :
Adminer , herramienta de gestión de bases de datos escrita en PHP.
fuente
Función auxiliar del framework Laravel 5
fuente
Fuente de http://www.xeweb.net/2011/02/11/generate-a-random-string-az-0-9-in-php/
fuente
La versión editada de la función funciona bien, pero solo encontré un problema: usó el carácter incorrecto para encerrar $ caracteres, por lo que el carácter 'a veces es parte de la cadena aleatoria que se genera.
Para arreglar esto, cambie:
a:
De esta forma, solo se utilizan los caracteres encerrados, y el carácter 'nunca será parte de la cadena aleatoria que se genera.
fuente
Otra línea única, que genera una cadena aleatoria de 10 caracteres con letras y números. Creará una matriz con
range
(ajuste el segundo parámetro para establecer el tamaño), recorre esta matriz y asigna un carácter ASCII aleatorio (rango 0-9 o az), luego implosiona la matriz para obtener una cadena.Nota: esto solo funciona en PHP 5.3 y posterior
fuente
rand(0, 57-48+122-97)<57-48?...:...
? :)Un trazador de líneas.
Es rápido para cuerdas enormes con cierta singularidad.
fuente
md5(rand())
Es una forma terriblemente insegura de generar un número aleatorio.Desde php7, existen las funciones random_bytes. https://www.php.net/manual/ru/function.random-bytes.php Para que pueda generar una cadena aleatoria como esa
fuente
Me gustó el último comentario que usó openssl_random_pseudo_bytes, pero no fue una solución para mí, ya que todavía tenía que eliminar los caracteres que no quería, y no pude obtener una cadena de longitud establecida. Aquí está mi solución ...
fuente
fuente
Aquí está mi solución simple de una línea para generar una contraseña aleatoria amigable, excluyendo los caracteres que se parecen, como "1" y "l", "O" y "0", etc. Aquí hay 5 caracteres, pero puede fácilmente cambiarlo por supuesto:
fuente
Aquí hay otra solución.
PD. Estoy usando PHP 7.2 en Ubuntu.
fuente
Otra forma de generar una cadena aleatoria en PHP es:
fuente
Así es como lo estoy haciendo para obtener una verdadera clave aleatoria única:
Puede usar time () ya que es una marca de tiempo Unix y siempre es única en comparación con otras aleatorias mencionadas anteriormente. Luego puede generar la suma md5 de eso y tomar la longitud deseada que necesita del MD5 generado cadena . En este caso, estoy usando 10 caracteres, y podría usar una cadena más larga si quisiera hacerla más única.
Espero que esto ayude.
fuente
time()
está lejos de ser único: devolverá el mismo valor una y otra vez hasta que finalice el segundo actual. Lo que realmente proporciona algo de aleatoriedad aquí es questr_shuffle()
el resto del código solo reduce la muestra para elegir caracteres.time()
(es solo una marca de tiempo), es una fuente débil de aleatoriedad.One-liner parametrizado usando solo funciones nativas de PHP , trabajando desde PHP 5.1.0
fuente