Estoy tratando de generar una contraseña aleatoria en php.
Sin embargo, obtengo todas las 'a' y el tipo de retorno es de tipo matriz y me gustaría que sea una cadena. ¿Alguna idea sobre cómo corregir el código?
Gracias.
function randomPassword() {
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
for ($i = 0; $i < 8; $i++) {
$n = rand(0, count($alphabet)-1);
$pass[$i] = $alphabet[$n];
}
return $pass;
}
/dev/random
son suficientes ya que la pregunta no solicita una contraseña " segura " (y no debe editarse para contenerla, ya que alteraría el significado de la pregunta original). Aunque estoy totalmente a favor de la seguridad, creo que esta bomba de alfombra no se pensó por completo. Al igual que el usomysql_*
, las respuestas siguen siendo válidas, pero deben marcarse como inseguras. ¿Quizás esto es algo que SO necesita incluir como software adicional: la capacidad de advertir sobre código inseguro?Respuestas:
Pruebe esto (use en
strlen
lugar decount
, porquecount
en una cadena siempre es1
):Demostración: http://codepad.org/UL8k4aYK
fuente
$pass .= $alphabet[$n]
.mt_rand
tampoco es mejor)openssl_random_pseudo_bytes()
se usa en lugar derand()
TL; DR:
random_int()
y lo dadorandom_str()
continuación.random_int()
, use random_compat .Explicación:
Como está generando una contraseña , debe asegurarse de que la contraseña que genera sea impredecible, y la única forma de garantizar que esta propiedad esté presente en su implementación es usar un generador de números pseudoaleatorios criptográficamente seguro (CSPRNG).
El requisito de un CSPRNG se puede relajar para el caso general de cadenas aleatorias, pero no cuando se trata de seguridad.
La respuesta simple, segura y correcta a la generación de contraseñas en PHP es usar RandomLib y no reinventar la rueda. Esta biblioteca ha sido auditada por expertos en seguridad de la industria, así como por mí mismo.
Para los desarrolladores que prefieren 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 antes de que se lance PHP 7. Usar nuestrorandom_int()
polyfill es probablemente más seguro que escribir su propia implementación.Con un generador de entero aleatorio seguro en la mano, generar una cadena aleatoria segura es más fácil que el pastel:
fuente
mcrypt_*
funciones. Puedo ver en un hilo de problemas que ha bifurcado la biblioteca porque no pudo obtener @ircmaxell, pero su bifurcación dice 'falla de compilación' en Travis. ¿Te gustaría actualizar esta respuesta (que todavía se muestra bastante alta en Google)?Sé que está intentando generar su contraseña de una manera específica, pero es posible que también desee ver este método ...
Está tomado del sitio php.net y crea una cadena que es dos veces la longitud del número que pones en la función openssl_random_pseudo_bytes. Entonces, lo anterior crearía una contraseña de 4 caracteres de longitud.
En breve...
Crearía una contraseña de 8 caracteres de longitud.
Sin embargo, tenga en cuenta que la contraseña solo contiene los números 0-9 y letras minúsculas af!
fuente
openssl_random_pseudo_bytes()
es un poderoso generador de aleatoriedad de bytes binarios completos y no necesita más barajado. También aprovecharé la oportunidad para señalar que es peligroso suponer que apilar múltiples métodos de cifrado hará que todo sea más aleatorio, en algunos casos, de hecho, puede ser exactamente lo contrario debido a la acumulación de colisiones de hash.Código minúsculo con 2 líneas.
demostración: http://codepad.org/5rHMHwnH
fuente
substr(str_shuffle(str_repeat($chars,$length)),0,$length);
Si está en PHP7, podría usar la
random_int()
función:fuente
mt_rand
para generar una contraseña.mt_rand
, por lo que sigue siendo inadecuada para cualquier uso de seguridad.$chars
En una línea:
fuente
substr(str_shuffle(str_repeat($chars,$length)),0,$length);
Entropía restauradaSu mejor apuesta es la biblioteca RandomLib de ircmaxell .
Ejemplo de uso:
Produce cadenas que son más fuertemente aleatorias que las funciones normales de aleatoriedad como
shuffle()
yrand()
(que es lo que generalmente desea para información confidencial como contraseñas, sales y claves).fuente
rand()
omt_rand()
.random_bytes
), pero eso no hace que lasrand
respuestas sean incorrectas.rand
no es una buena opción para contraseñasrand()
incorrectas. ¡Son incorrectos por sí solos!Usted quiere
strlen($alphabet)
, nocount
de la constantealphabet
(equivalente a'alphabet'
).Sin embargo,
rand
no es una función aleatoria adecuada para este propósito. Su salida se puede predecir fácilmente ya que se siembra implícitamente con la hora actual. Además,rand
no es criptográficamente seguro; Por lo tanto, es relativamente fácil determinar su estado interno a partir de la salida.En su lugar, lea
/dev/urandom
para obtener datos criptográficamente aleatorios.fuente
Voy a publicar una respuesta porque algunas de las respuestas existentes están cerca pero tienen una de:
Esta respuesta eludirá el
count/strlen
problema ya que la seguridad de la contraseña generada, al menos en mi humilde opinión, trasciende cómo está llegando allí. También voy a asumir PHP> 5.3.0.Analicemos el problema en las partes constituyentes que son:
Para la primera parte, PHP> 5.3.0 proporciona la función
openssl_random_pseudo_bytes
. Tenga en cuenta que, si bien la mayoría de los sistemas usan un algoritmo criptográficamente fuerte, debe verificarlo, así que usaremos un contenedor:Para la segunda parte, usaremos
base64_encode
ya que toma una cadena de bytes y producirá una serie de caracteres que tienen un alfabeto muy cercano al especificado en la pregunta original. Si no nos importa tener+
,/
y los=
caracteres aparecen en la cadena final y queremos un resultado de al menos$n
caracteres largos, simplemente podríamos usar:El
3/4
factor se debe al hecho de que la codificación base64 da como resultado una cadena que tiene una longitud al menos un tercio más grande que la cadena de bytes. El resultado será exacto por$n
ser un múltiplo de 4 y hasta 3 caracteres más de lo contrario. Dado que los caracteres adicionales son predominantemente el carácter de relleno=
, si por alguna razón tuvimos la restricción de que la contraseña tenga una longitud exacta, entonces podemos truncarla a la longitud que queramos. Esto se debe especialmente a que, para un determinado$n
, todas las contraseñas terminarían con el mismo número de ellas, de modo que un atacante que tuviera acceso a una contraseña resultante, tendría hasta 2 caracteres menos para adivinar.Para obtener crédito adicional, si quisiéramos cumplir con las especificaciones exactas como en la pregunta del OP, entonces tendríamos que hacer un poco más de trabajo. Voy a renunciar al enfoque de conversión de base aquí e ir con uno rápido y sucio. Ambos necesitan generar más aleatoriedad de la que se utilizará en el resultado de todos modos debido al alfabeto largo de 62 entradas.
Para los caracteres adicionales en el resultado, simplemente podemos descartarlos de la cadena resultante. Si comenzamos con 8 bytes en nuestra cadena de bytes, entonces hasta aproximadamente el 25% de los caracteres base64 serían estos caracteres "indeseables", de modo que simplemente descartar estos caracteres da como resultado una cadena no más corta que la OP deseada. Entonces podemos simplemente truncarlo para llegar a la longitud exacta:
Si genera contraseñas más largas, el carácter de relleno
=
forma una proporción cada vez menor del resultado intermedio para que pueda implementar un enfoque más ágil, si es preocupante drenar el grupo de entropía utilizado para el PRNG.fuente
openssl_random_pseudo_bytes
podría producir un resultado débil. No me di cuenta de que ese era el caso.base_convert(uniqid('pass', true), 10, 36);
p.ej.
e0m6ngefmj4
EDITAR
Como mencioné en los comentarios, la longitud significa que los ataques de fuerza bruta funcionarían mejor contra él que los ataques de tiempo, por lo que no es realmente relevante preocuparse por "cuán seguro era el generador aleatorio". La seguridad, específicamente para este caso de uso, debe complementar la usabilidad para que la solución anterior sea realmente lo suficientemente buena para el problema requerido.
Sin embargo, en caso de que haya encontrado esta respuesta mientras buscaba un generador de cadenas aleatorias seguro (como supongo que algunas personas se han basado en las respuestas), para algo como generar tokens, así es como se vería un generador de dichos códigos:
fuente
Otro (solo Linux)
fuente
fread()
almacena de forma predeterminada 8192 bytes, por lo que siempre leerá tantos/dev/urandom
con el código dado. Esto tampoco funcionará en Windows. Sin embargo, felicitaciones por usar un CSPRNG.Ser un poco más inteligente:
compruébalo aquí .
fuente
Use este código simple para generar una contraseña med-strong de longitud 12
fuente
Pruebe esto con letras mayúsculas, minúsculas, numéricos y caracteres especiales
Ejemplo de salida (s):
, IZCQ_IV \ 7
@wlqsfhT (d
1! 8 + 1 \ 4 @ uD
fuente
rand
función no es criptográficamente segura, por lo que podría ser un riesgo generar una contraseña al usarlaUno rápido Formato simple, limpio y consistente si eso es lo que quieres
fuente
Esto se basa en otra respuesta en esta página, https://stackoverflow.com/a/21498316/525649
Esta respuesta genera caracteres hexadecimales solo,
0-9,a-f
. Para algo que no parece hexadecimal, intente esto:base64_encode
devuelve una extensión más amplia de caracteres alfanuméricosrtrim
elimina el a=
veces al finalEjemplos:
32eFVfGDg891Be5e7293e54z1D23110M3ZU3FMjb30Z9a740Ej0jz4
b280R72b48eOm77a25YCj093DE5d9549Gc73Jg8TdD9Z0Nj4b98760
051b33654C0Eg201cfW0e6NA4b9614ze8D2FN49E12Y0zY557aUCb8
y67Q86ffd83G0z00M0Z152f7O2ADcY313gD7a774fc5FF069zdb5b7
Esto no es muy configurable para crear una interfaz para los usuarios, pero para algunos propósitos está bien. Aumente la cantidad de caracteres para explicar la falta de caracteres especiales.
fuente
Llámalo como en los comentarios.
fuente
Creé un script de contraseña más completo y seguro. Esto creará una combinación de dos mayúsculas, dos minúsculas, dos números y dos caracteres especiales. Total de 8 caracteres.
fuente
fuente
Genera una contraseña segura de longitud 8 que contiene al menos una letra minúscula, una letra mayúscula, un dígito y un carácter especial. También puede cambiar la longitud en el código.
fuente
Esta función generará una contraseña basada en las reglas de los parámetros.
fuente
Aquí está mi asistente de generación de contraseña simple al azar.
Asegura que la contraseña tenga números, letras mayúsculas y minúsculas, así como un mínimo de 3 caracteres especiales.
La longitud de la contraseña será entre 11 y 30.
fuente