Inicio Apuntes FPApuntes DAW Generar passwords con PHP de manera aleatoria
php logo

Generar passwords con PHP de manera aleatoria

por entreunosyceros
Publicado el: Última actualización:

El post que dejo hoy es un pequeño generador de passwords con PHP de manera aleatoria. Este tipo de aplicaciones siempre viene bien tenerlos a mano.  Con este sencillo script PHP podremos obtener una serie de caracteres aleatorios de la longitud deseada y con la dificultad que seleccionemos ( solo letras, con números, con mayúsculas, con caracteres especiales ).

Este tipo de aplicaciones son perfectas para las webs que generen el password de los usuarios al registrarse y se lo manden por correo. Esto último ya es otras historia, por esto vamos a ver los dos archivos de los que se compone este ejemplo.

Generar passwords con PHP

Password.html

<head>
    <title>Generador de Passwords</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script type="text/javascript">
    
    function validaForm(){
    	var errores = "";
    	var respuesta = true;
    	
		if( !$("input[name|='caracteres[]']").is(':checked') ){
			respuesta = false;
		 	errores += "Debes seleccionar al menos una opción \\n" ;
		}
		var numcaracteres = $("#numcaracteres").attr('value');
		
		if( numcaracteres == '' || ( numcaracteres < 6 || numcaracteres > 16 ) ){
			respuesta = false;
			errores += "Los caracteres para la contraseñaa deben estar entre 6 y 16 caracteres";
		}
		
		return '{"valor": ' + respuesta + ', "mensaje": "' + errores + '"}';
    }
    $(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>
  </head>
  <body>
      <div>
          <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 generada:<br/>
          <input type="text" name="txtPassword" id="txtPassword" value=""/>
      </div>
  </body>

Password.php
<?php
// Verifica que existan los datos que se enviaron desde el formulario
if(isset($_POST["caracteres"]) && isset($_POST["numcaracteres"])){
	
	//La informacion que se se recibe 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 ya se utilizo el valor del residuo
    	$bandera = false;
    	
    	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 minúsculas 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 mayúsculas, numeros, caracteres especiales
				 */ 
            	if($bandera){
                	$bandera = false;
	                $max = $aux + $residuo;
    	        }
        	    else 
            	    $max = $aux;
				
				//Genera los caracteres en minúsculas
	            for($x = 0; $x < $max; $x++)
					// Se almacenan en un array 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 array 
	    shuffle($arraypassword);
		// Se recorren todos los valores del array y se imprimen
    	foreach ($arraypassword as $caracter)
        	echo $caracter;
    }
}
?>

Si quieres ver un ejemplo de funcionamiento de este código puedes verlo en acción en el siguiente enlace.

Fuente.


También te puede interesar ...

2 Comentarios

Pablo 3 noviembre, 2016 - 12:07 PM

Gracias para el aporte. PEro necesitaria que que generase un número determinado de contraseñas. Gracias

Responder
sapoclay 3 noviembre, 2016 - 1:26 PM

Hola. En primer lugar, gracias por la visita. Y después decirte que si necesitas que genere un número determinado de contraseñas, supongo que bastaría con añadirle un nuevo campo en el formulario y utilizar este campo como contador de contraseñas para generar. Salu2 y suerte.

Responder

Deja tu comentario

* Al utilizar este formulario, acepta que este sitio web almacene y maneje sus datos.

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