Como crear un generador de contraseñas aleatorias con PHP + jQuery

Stay hungry, stay foolish

Steve Jobs

Hola a todos los lectores del blog, en esta ocasión les traigo un ejemplo en el cual se explica como podemos crear un generador de contraseñas aleatorias mediante PHP y jQuery, espero que les sirva.

ARCHIVO HTML

Lo primero que vamos a hacer es crear el formulario HTML con el siguiente codigo

<h2> Generador de contraseñas </h2>
<form id="frmPasswords">
   Selecciona los caracteres que quieres utilizar <br/>
   <input type="checkbox" name="caracteres[]" value="mayusculas" />A-Z<br/>
   <input type="checkbox" name="caracteres[]" value="minusculas" />a-z<br/>
   <input type="checkbox" name="caracteres[]" value="numeros" />0-9<br/>
   <input type="checkbox" name="caracteres[]" value="c_especiales" />?!*-_.%$/<br/>
   Num de caracteres: <input type="text" name="numcaracteres" id="numcaracteres" size="2"/> <br/>
   <input type="button" name="btnGenerar" id="btnGenerar" value="Generar"/>
</form>
Contraseña:<br/>
<input type="text" name="txtPassword" id="txtPassword" value=""/>

Ahora agregamos el codigo de jQuery dentro de head

<script type="text/javascript">
$(document).ready(function(){
  $("#btnGenerar").click(function(){
    respuesta = validaForm();
    respuesta = jQuery.parseJSON(respuesta);
    if( respuesta.valor == true ){
      $.ajax({
        url: "password.php",
        type: "POST",
        data: $("#frmPasswords").serialize(),
        dataType: "html",
        success: function(password) {
          $("#txtPassword").attr('value',password);
        }
      });
    }
    else
      alert(respuesta.mensaje);
  });
});
</script>

Lo que se hace con el código anterior es agregar el evento click al elemento con id ” btnGenerar”, para que cuando el evento se ejecute se haga la petición ajax y se genere la contraseña desde el archivo password.php,  este archivo  imprime la contraseña que se mostrara en el elemento con id “txtPassword”.

También es necesario agregar un codigo que haga la validación antes de enviar el formulario, para esto se creo una funcion que se llama validaForm, la cual se coloca dentro de las etiquetas head, la funcion regresa una cadena de texto con la estructura JSON, valor indica si todo esta correcto, puede devolver true o false, mientras que en mensaje contiene los mensaje  de error que se van a mostrar.

function validaForm(){
  var errores = "";
  var respuesta = true;

  if( !$("input[name|='caracteres[]']").is(':checked') ){
    respuesta = false;
    errores += "Checbox: Debes seleccionar al menos una opcion \\n" ;
  }
  var numcaracteres = $("#numcaracteres").attr('value');

  if( numcaracteres == '' || ( numcaracteres < 6 || numcaracteres > 16 ) ){
    respuesta = false;
    errores += "Los caracteres para la contraseña deben estar entre 6 y 16";
  }

  return '{"valor": ' + respuesta + ', "mensaje": "' + errores + '"}';
}

 

ARCHIVO: password.php

El siguiente código genera la contraseña que se mostrara en el input text, para no hacer esto muy extenso solo colocare comentarios al codigo.

<?php
// Verifica que existan los datos que se enviaron desde el formulario
if(isset($_POST["caracteres"]) && isset($_POST["numcaracteres"])){

  //La informacion que se recibio del formulario se almacena en variables
  $numcaracteres = $_POST["numcaracteres"];
  $caracteres = $_POST["caracteres"];

  // Verifica que el valor de $numcaracteres este entre 6 y 16
  if($numcaracteres >= 6 && $numcaracteres <= 16){
    //Se definen las variables con los caracteres a utilizar en la contraseña
    $mayusculas = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $minusculas = "abcdefghijklmnopqrstuvwxyz";
    $numeros = "0123456789";
    $c_especiales = "?!*-+_%#/=()";
    /* Para asegurar que se utilizen los valores seleccionados
     * utilizo 2 variables para determinar cuantos caracteres
     * de cada tipo se van a utilizar.
     *
     * $aux almacena el numero de caracteres a utilizar por cada tipo,
     * ese dato tiene que ser un numero entero por eso se redondea hacia
     * abajo con la funcion floor
     */
     $aux = floor($numcaracteres / count($caracteres));

    /* Al momento de hacer la division puede que haya quedado un residuo
     * ese se almacena en la variable $residuo
     */
     $residuo = $numcaracteres % count($caracteres);

    // La bandera la utiliza para determinar si se va a utilizar el valor del residuo
     $bandera = false;
    // si el residuo es diferente de 0 se enciende la bandera
     if($residuo != 0)
       $bandera = true; 
   
    // Se crea un ciclo para ir generando los caracteres que contendra la contraseña 
     for($i=0; $i<count($caracteres); $i++){
       // Determina si se van a generar minusculas para la contraseña
       if( $caracteres[$i] == "minusculas"){
         /* Determina si se va a utilizar el valor del residuo, si se va a utilizar
          * se le asigna a $max el valor de $aux + $residuo, en caso contrario
          * se asigna a $max solo la variable $aux.
          *
          * Esto mismo se repite para mayusculas, numeros, caracteres especiales
          */
          if($bandera){
            $bandera = false;
            $max = $aux + $residuo;
          }
          else
            $max = $aux;

          //Genera los caracteres en minusculas
          for($x = 0; $x < $max; $x++)
            // Se almacenan en un arreglo los valores que se generan
            $arraypassword[] = substr($minusculas, rand(0, strlen($minusculas)-1),1);
          }
          if( $caracteres[$i] == "mayusculas"){
            if($bandera){
              $bandera = false;
              $max = $aux+$residuo;
          }
          else
            $max = $aux;
          for($x = 0; $x < $max; $x++)
            $arraypassword[] = substr($mayusculas, rand(0, strlen($mayusculas)-1),1);
       }
       if( $caracteres[$i] == "numeros"){
         if($bandera){
           $bandera = false;
           $max = $aux+$residuo;
         }
         else
           $max = $aux;
         for($x = 0; $x < $max; $x++)
           $arraypassword[] = substr($numeros, rand(0, strlen($numeros)-1),1);
       }
       if( $caracteres[$i] == "c_especiales"){
         $max = $aux;
         for($x = 0; $x < $max; $x++)
           $arraypassword[] = substr($c_especiales, rand(0, strlen($c_especiales)-1),1);
       }
     }
     // Una vez que se genero la contraseña se desordena el arreglo
     shuffle($arraypassword);
     // Se recorren todos los valores del arreglo y se imprimen
     foreach ($arraypassword as $caracter)
       echo $caracter;
  }
}
?>