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

¡¡AVISO!! Esta entrada tiene más de dos años desde su publicación. Es posible que el contenido esté desactualizado.

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.