Cómo crear una aplicación en C# de Visual Studio .Net que genera contraseñas aleatorias. Permitirá indicar los posibles caracteres de la contraseña, si queremos incluir mayúsculas, minúsculas, números y caracteres especiales. La aplicación permite indicar el tamaño de la contraseña y el número de contraseñas a generar. Además, incluye un control para que las contraseñas generadas cumplan los criterios elegidos.
- Crear proyecto en Microsoft Visual Studio Community 2019 de Aplicación Windows Forms C#.
- Código fuente de la aplicación C# que genera contraseñas aleatorias.
- La aplicación Generador de contraseñas aleatorias en funcionamiento.
- Descarga del código fuente completo en C# y en Microsoft Visual Studio Community 2019 de la aplicación Generador de contraseñas aleatorio.
Crear proyecto en Microsoft Visual Studio Community 2019 de Aplicación Windows Forms C#
En primer lugar crearemos un nuevo proyecto. En nuestro caso usaremos el IDE gratuito de programación Microsoft Visual Studio Community 2019. Crearemos un proyecto de tipo «Aplicación de Windows Forms (.NET Framework)» de C#:
En el formulario principal de la aplicación agregaremos los siguientes componentes:
Agregaremos las referencias necesarias, desde el menú «Proyecto»
Marcaremos las siguientes referencias:
- System.Core
- System.Xml
- System.Net.Http
- System.Data
- System.Drawing
- System
- System.Data.DataSetExtensions
- System.Deployment
- System.Xml.Linq
- Microsoft.CSharp
- System.Windows.Forms
Código fuente de la aplicación C# que genera contraseñas aleatorias
La aplicación tendrá una clase, con el nombre GeneradorContrasenasAleatorias, que será la encargada de generar las contraseñas aleatorias. Y tendrá un formulario principal donde se podrán estableer las opciones de las contraseñas a generar. A continuación mostramos el código de la clase y del formulario.
El código fuente completo en C# puede descargargarse gratuitamente desde el siguiente enlace:
Código fuente de la clase para generar contraseñas aleatorias en C#
Agregaremos una nueva clase a nuestro proyecto C#. Pulsaremos con el botón derecho sobre la solución y elegiremos en el menú emergente «Agregar» – «Clase»:
Introduciremos el nombre «GenerarContrasenaAleatoria» y pulsaremos «Agregar»:
Y agregaremos el siguiente código fuente en C# a la clase creada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
using System; using System.Text.RegularExpressions; using System.Windows.Forms; namespace GeneradorContrasenasAleatorias { class GenerarContrasenaAleatoria { //const string CARACTERES_MINUSCULAS = "abcdefghijklmnopqursuvwxyz"; //const string CARACTERES_MAYUSCULAS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //const string NUMEROS = "123456789"; //const string CARACTERES_ESPECIALES = @"!@£$%^&*()#€"; //const string CARACTERES_ESPECIALES = @".+*%#@?"; const int MAXIMO_CARACTERES_CONSECUTIVOS_IGUALES = 1; public string contrasena { get; set; } public bool correcta { get; set; } public int reintentos { get; set; } public int numReintentosTotales { get; set; } public string GenerarContrasena(bool usarMinusculas, bool usarMayusculas, bool usarNumeros, bool usarCaracteresEspeciales, int tamanoContrasena, string caracteresMinusculas, string caracteresMayusculas, string numeros, string caracteresEspeciales) { char[] contrasena = new char[tamanoContrasena]; string caracteres = ""; // Inicializamos a vacío Random numAleatorio = new Random(); int contador; //Al menos uno de los requisitos debe ser true if (!usarMayusculas & !usarMinusculas & !usarCaracteresEspeciales & !usarNumeros) usarMinusculas = true; // Construye el conjunto de caracteres a elegir if (usarMinusculas) caracteres += caracteresMinusculas; if (usarMayusculas) caracteres += caracteresMayusculas; if (usarNumeros) caracteres += numeros; if (usarCaracteresEspeciales) caracteres += caracteresEspeciales; for (contador = 0; contador < tamanoContrasena; contador++) { contrasena[contador] = caracteres[numAleatorio.Next(caracteres.Length - 1)]; bool caracteresIgualesConsecutivos = contador > MAXIMO_CARACTERES_CONSECUTIVOS_IGUALES && contrasena[contador] == contrasena[contador - 1] && contrasena[contador - 1] == contrasena[contador - 2]; //Si hay caracteres iguales consecutivos retrocedemos //la iteración para generar un carácter diferente if (caracteresIgualesConsecutivos) { contador--; } } return String.Join(null, contrasena); } public bool RevisarContrasena(string contrasena, bool usarMinusculas, bool usarMayusculas, bool usarNumeros, bool usarCaracteresEspeciales) { const string REGEX_LOWERCASE = @"[a-z]"; const string REGEX_UPPERCASE = @"[A-Z]"; const string REGEX_NUMERIC = @"[\d]"; //const string REGEX_SPECIAL = @"([!#$%&*@\\])+"; const string REGEX_SPECIAL = @"([.+*%#@?])"; try { bool tieneCaracteresMinusculas = !usarMinusculas || (usarMinusculas && Regex.IsMatch(contrasena, REGEX_LOWERCASE)); bool tieneCaracteresMayusculas = !usarMayusculas || (usarMayusculas && Regex.IsMatch(contrasena, REGEX_UPPERCASE)); bool tieneNumeros = !usarNumeros || (usarNumeros && Regex.IsMatch(contrasena, REGEX_NUMERIC)); bool tieneCaracteresEspeciales = !usarCaracteresEspeciales || (usarCaracteresEspeciales && Regex.IsMatch(contrasena, REGEX_SPECIAL)); if ((tieneCaracteresMinusculas && tieneCaracteresMayusculas && tieneNumeros && tieneCaracteresEspeciales)) return true; else return false; } catch (Exception err) { MessageBox.Show("Error al verificar una contraseña: " + err.Message, "Error verificación...", MessageBoxButtons.OK, MessageBoxIcon.Error); return true; } } public int ReintentosContrasenaCorrecta(int reintentosMaximo, string contrasena, bool usarMinusculas, bool usarMayusculas, bool usarNumeros, bool usarCaracteresEspeciales, int tamanoContrasena, string caracteresMinusculas, string caracteresMayusculas, string numeros, string caracteresEspeciales) { this.numReintentosTotales = 0; string contrasenaGenerada = ""; bool contrasenaCorrecta = false; int numReintentos = 0; while (!contrasenaCorrecta) { numReintentos++; contrasenaGenerada = GenerarContrasena(usarMinusculas, usarMayusculas, usarNumeros, usarCaracteresEspeciales, tamanoContrasena, caracteresMinusculas, caracteresMayusculas, numeros, caracteresEspeciales); contrasenaCorrecta = RevisarContrasena(contrasenaGenerada, usarMinusculas, usarMayusculas, usarNumeros, usarCaracteresEspeciales); //Limitamos el número de iteraciones por si no se genera una contraseña correcta //Para evitar un posible bucle infinito if (numReintentos == reintentosMaximo) contrasenaCorrecta = true; this.numReintentosTotales = numReintentos + this.numReintentosTotales; } this.contrasena = contrasenaGenerada; this.correcta = contrasenaCorrecta; this.reintentos = numReintentos; return numReintentos; } } } |
Código fuente del formulario principal de la aplicación que genera contraseñas aleatorias
El formulario principal, llamado formGenContrasena, tendrá el siguiente código fuente C#:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
using System; using System.Text.RegularExpressions; using System.Windows.Forms; namespace GeneradorContrasenasAleatorias { class GenerarContrasenaAleatoria { //const string CARACTERES_MINUSCULAS = "abcdefghijklmnopqursuvwxyz"; //const string CARACTERES_MAYUSCULAS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //const string NUMEROS = "123456789"; //const string CARACTERES_ESPECIALES = @"!@£$%^&*()#€"; //const string CARACTERES_ESPECIALES = @".+*%#@?"; const int MAXIMO_CARACTERES_CONSECUTIVOS_IGUALES = 1; public string contrasena { get; set; } public bool correcta { get; set; } public int reintentos { get; set; } public int numReintentosTotales { get; set; } public string GenerarContrasena(bool usarMinusculas, bool usarMayusculas, bool usarNumeros, bool usarCaracteresEspeciales, int tamanoContrasena, string caracteresMinusculas, string caracteresMayusculas, string numeros, string caracteresEspeciales) { char[] contrasena = new char[tamanoContrasena]; string caracteres = ""; // Inicializamos a vacío Random numAleatorio = new Random(); int contador; //Al menos uno de los requisitos debe ser true if (!usarMayusculas & !usarMinusculas & !usarCaracteresEspeciales & !usarNumeros) usarMinusculas = true; // Construye el conjunto de caracteres a elegir if (usarMinusculas) caracteres += caracteresMinusculas; if (usarMayusculas) caracteres += caracteresMayusculas; if (usarNumeros) caracteres += numeros; if (usarCaracteresEspeciales) caracteres += caracteresEspeciales; for (contador = 0; contador < tamanoContrasena; contador++) { contrasena[contador] = caracteres[numAleatorio.Next(caracteres.Length - 1)]; bool caracteresIgualesConsecutivos = contador > MAXIMO_CARACTERES_CONSECUTIVOS_IGUALES && contrasena[contador] == contrasena[contador - 1] && contrasena[contador - 1] == contrasena[contador - 2]; //Si hay caracteres iguales consecutivos retrocedemos //la iteración para generar un carácter diferente if (caracteresIgualesConsecutivos) { contador--; } } return String.Join(null, contrasena); } public bool RevisarContrasena(string contrasena, bool usarMinusculas, bool usarMayusculas, bool usarNumeros, bool usarCaracteresEspeciales) { const string REGEX_LOWERCASE = @"[a-z]"; const string REGEX_UPPERCASE = @"[A-Z]"; const string REGEX_NUMERIC = @"[\d]"; //const string REGEX_SPECIAL = @"([!#$%&*@\\])+"; const string REGEX_SPECIAL = @"([.+*%#@?])"; try { bool tieneCaracteresMinusculas = !usarMinusculas || (usarMinusculas && Regex.IsMatch(contrasena, REGEX_LOWERCASE)); bool tieneCaracteresMayusculas = !usarMayusculas || (usarMayusculas && Regex.IsMatch(contrasena, REGEX_UPPERCASE)); bool tieneNumeros = !usarNumeros || (usarNumeros && Regex.IsMatch(contrasena, REGEX_NUMERIC)); bool tieneCaracteresEspeciales = !usarCaracteresEspeciales || (usarCaracteresEspeciales && Regex.IsMatch(contrasena, REGEX_SPECIAL)); if ((tieneCaracteresMinusculas && tieneCaracteresMayusculas && tieneNumeros && tieneCaracteresEspeciales)) return true; else return false; } catch (Exception err) { MessageBox.Show("Error al verificar una contraseña: " + err.Message, "Error verificación...", MessageBoxButtons.OK, MessageBoxIcon.Error); return true; } } public int ReintentosContrasenaCorrecta(int reintentosMaximo, string contrasena, bool usarMinusculas, bool usarMayusculas, bool usarNumeros, bool usarCaracteresEspeciales, int tamanoContrasena, string caracteresMinusculas, string caracteresMayusculas, string numeros, string caracteresEspeciales) { this.numReintentosTotales = 0; string contrasenaGenerada = ""; bool contrasenaCorrecta = false; int numReintentos = 0; while (!contrasenaCorrecta) { numReintentos++; contrasenaGenerada = GenerarContrasena(usarMinusculas, usarMayusculas, usarNumeros, usarCaracteresEspeciales, tamanoContrasena, caracteresMinusculas, caracteresMayusculas, numeros, caracteresEspeciales); contrasenaCorrecta = RevisarContrasena(contrasenaGenerada, usarMinusculas, usarMayusculas, usarNumeros, usarCaracteresEspeciales); //Limitamos el número de iteraciones por si no se genera una contraseña correcta //Para evitar un posible bucle infinito if (numReintentos == reintentosMaximo) contrasenaCorrecta = true; this.numReintentosTotales = numReintentos + this.numReintentosTotales; } this.contrasena = contrasenaGenerada; this.correcta = contrasenaCorrecta; this.reintentos = numReintentos; return numReintentos; } } } |
La aplicación Generador de contraseñas aleatorias en funcionamiento
La aplicación tiene las siguientes opciones de configuración antes de generar las contraseñas:
- Que contengan letras minúsculas: si marcamos esta opción las contraseñas generadas incluirán alguna letra minúscula de las indicadas en el cuadro de texto.
- Que contengan letras mayúsculas: si marcamos esta opción las contraseñas generadas incluirán alguna letra mayúscula de las indicadas en el cuadro de texto.
- Que contengan números: si marcamos esta opción las contraseñas generadas incluirán algún número de los indicados en el cuadro de texto.
- Que contengan caracteres especiales: si marcamos esta opción las contraseñas generadas incluirán algún carácter especial de los indicados en el cuadro de texto.
- Tamaño de la contraseña: número de caracteres que tendrán las contraseñas generadas aleatoriamente.
- Nº reintentos máximo si la contraseña no cumple: si se marcan todos los criterios de fortaleza de la contraseña anteriores y se elige una tamaño de contraseña pequeño, puede que la generación aleatoria no genere contraseñas que cumplan estos criterios. Por ello, la aplicación permite realizar un número de reintentos hasta obtener contraseñas que cumplan los criterios. Para evitar un posible bucle infinito (que puede suceder si no se logra generar contraseñas aleatorias que cumplan los criterios elegidos) se debe establecer aquí un número máximo de reintentos. Es recomendable no sobrepasar el millón, dado que la generación podría tardar mucho tiempo.
- Nº de contraseñas a generar: el número de contraseñas aleatorias que se generarán.
Una vez introducidos los criterios pulsaremos en «Generar contraseñas»:
El proceso puede tardar unos minutos en función de los criterios elegidos, del número de contraseñas, del tamaño y de los caracteres elegidos para la generación. Mostrará una barra de progreso que es orientativa, indicando el progreso de la generación de las contraseñas. Una vez concluido mostrará las contraseñas en el cuadro de texto, para que se puedan copiar y pegar y mostrará el número de reintentos total que ha usado para generarlas y si ha generado alguna contraseña que no cumpla alguno de los criterios:
En el ejemplo vemos que ha generado 10 contraseñas, con tamaño de 11 caracteres, que deben incluir mayúsculas, minúsculas, números y caracteres especiales. Para generar estas contraseñas cumpliendo estos criterios ha empleado algo más de 13 millones de intentos. En el ejemplo ha tadado 3 segundos en la generación.
Descarga del código fuente completo en C# y en Microsoft Visual Studio Community 2019 de la aplicación Generador de contraseñas aleatorio
A continuación mostramos el enlace para la descarga de la aplicación y el código fuente completo en C#: