Inicio Apuntes FPApuntes DAW Generar passwords con PHP de manera aleatoria

Generar passwords con PHP de manera aleatoria

Publicado por entreunosyceros
Publicado el: Última actualización:

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 ...

Deja un comentario

* Al utilizar este formulario, aceptas que este sitio web almacene y maneje tus datos.

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

Respuesta
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.

Respuesta

Adblock Detectado!!

Ayúdanos deshabilitando la extensión AdBlocker de tu navegador para visitar esta web.
Si no sabes hacerlo en Chrome, consulta el siguiente enlace. Si utilizas Firefox, puedes consultar este otro enlace.
Esto mejorará tu experiencia en este sitio web.