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.
2 Comentarios
Gracias para el aporte. PEro necesitaria que que generase un número determinado de contraseñas. Gracias
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.