Generar contraseña aleatoria con PHP

En todo proyecto web que requiera un registro e inicio de sesión de usuarios, sería un detalle y queda mucho más profesional permitir también a estos usuarios poder recuperar su contraseña.

Puede darse el caso de que el usuario vuelva a tu sitio web después de 1 año y no recuerde la contraseña que introdujo en aquel momento.

Desde mi punto de vista, la opción de permitir recuperar la contraseña no puede faltar en ningún proyecto que requiera registro de usuarios.

Si la contraseña está encriptada en la base de datos, que sería lo lógico, será prácticamente imposible recuperarla en su formato original a no ser que se guarde también sin encriptar. Esto último no lo recomiendo.

La idea sería ofrecer una solución híbrida que no sea insegura para el usuario como, por ejemplo, que a través de su email se le pueda enviar por correo electrónico una contraseña nueva generada de forma aleatoria.

En este artículo te voy a enseñar la función que utiliza en todos mis proyectos hechos a medida para generar contraseñas de forma aleatoria.

Función generar contraseña aleatoria

function generatePassword($length)
{
    $key = "";
    $pattern = "1234567890abcdefghijklmnopqrstuvwxyz";
    $max = strlen($pattern)-1;
    for($i = 0; $i < $length; $i++){
        $key .= substr($pattern, mt_rand(0,$max), 1);
    }
    return $key;
}

Esta función recibe un único parámetro y no es más que la longitud de caracteres que tendrá la contraseña que se generará de forma aleatoria.

¿Cuál es la lógica de la función que genera una contraseña aleatoria?

  • Definimos la variable $key vacía.
  • Definimos la variable $pattern con una cadena con los números del 0 al 9 y las letras del abecedario en minúsculas.
  • En la variable $max asignamos la longitud de la cadena $pattern.
  • Iteramos hasta la la variable $length que recibe como parámetro la función.
  • Rellenamos la variable $key con un carácter seleccionado aleatoriamente de la cadena $pattern usando la función mt_rand() de PHP que justamente permite generar un número entero aleatorio.
  • La función substr() es clave para seleccionar la posición exacta donde se encuentra el carácter seleccionado aleatoriamente. Esta función es muy útil ya que devuelve parte de una cadena. En este caso, tan solo nos interesa devolver un carácter.
  • Cuando se sale del bucle, se retorna la variable $key que contiene la cadena o contraseña aleatoria.

Generar una contraseña aleatoria más segura

Para generar una contraseña aleatoria más segura puedes seguir usando la misma función pero puedes ampliar con mayúsculas y caracteres especiales la variable $pattern.

Por ejemplo:

$pattern = "1234567890abcdefghijklmñnopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ.-_*/=[]{}#@|~¬&()?¿";

Ver demo Descargar

Conclusiones

Si quieres que tus usuarios sigan utilizando tus aplicaciones o páginas webs, es muy buena idea ayudarles a recuperar su contraseña si se da el caso de que no pueden entrar porque ya no se acuerdan o la han perdido.

La funcionalidad que permite recuperar contraseñas a los usuarios es más importante de lo que crees.

A menudo, se piensa que no es importante y es una funcionalidad que siempre se deja para el final y es posible que quede en el olvido y nunca se desarrolle. Pues vengo a decirte que puedes perder clientes potenciales si tu aplicación o página web no ofrece esta solución.

Situémonos en el ejemplo de una tienda online sin esta característica. Soy un cliente que se registró hace 1 año y ahora no me acuerdo de la contraseña. Quiero comprar pero no existe la posibilidad de recuperar mi contraseña. Pierdes la venta en caliente. Mal asunto.

¿Qué opinas? ¿Es importante para ti esta función? ¿Tienes alguna función mejor? Compártela y ayuda a la comunidad.

Autor
Escrito por Jose Aguilar - Director ejecutivo y tecnológico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.
Te ha servido? Valora esta entrada!
(12 votos, promedio: 5 de 5)
Comparte en las redes sociales
¿Buscas trabajo de programador?

12 respuestas a “Generar contraseña aleatoria con PHP”

  1. si quisiera solo 5 digitos como pudiera establecerla es para una recuperacion de contraseña yo crearla al azar y mandarsela al usario solo de 5 digitos

    • Jose Aguilar dice:

      Hola,

      La función generatePassword le puedes pasar el parámetro de la longitud para indicarle 5.

      Luego, para mandárselo al usuario puedes usar la función mail o la clase Mailer de PHP.

      Saludos

  2. David dice:

    Gracias por la aportacion; me resulto util.

  3. Antonio dice:

    Jose! es una pena que a estas alturas desconozcas realmente como funciona strlen.
    Y en consecuencia te arriesgues sin probarlo a publicar ‘Generar una contraseña aleatoria más segura’.

    No obstante! no estoy aqui para dar clases, seguro que ya sabras por donde voy.

    Saludos

  4. Pablo José dice:

    Excelente código. Muchas gracias. Suple la necesidad que tengo. Es funcional cuando se genera la contraseña por primera vez. La función md5() se utiliza cuando el registro ya tiene la contraseña y se necesita validar contra la base de datos como ocurre con los LOGIN de acceso a una aplicación. Saludos desde Bogotá, Colombia.

  5. Simón Álvarez dice:

    Me parece muy buen código, garantiza que la contraseña sea de la longitud deseada y los caracteres sean los que uno quiera, solo veo un detalle en el for, el rango del rand debe ser de 0 a 61.

    Gracias por el aporte.

  6. johan vera dice:

    buen dia si yo no quiero que la contrasena sea aleatoria? yo quiero que me genere para cada usuario una contrasena? y cada vez que yo meta el mismo usuario me genere la misma contrasena? me puede ayudar…?

    • Jose Aguilar dice:

      Hola,

      Una solución rápida para cubrir tu necesidad es utilizar la función md5() de php para guardar de forma cifrada la contraseña. Puedes hacer algo así:

      $password = md5($nombre_usuario);

      Saludos

  7. JORGE CHILENO dice:

    Simple y perfecto

  8. jaime dice:

    !es simplemente sencillo y sencillamente perfecto!

  9. Oswaldo Sudberry dice:

    I don’t usually comment but I gotta tell thankyou for the post on this perfect one : D.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Ver más sobre