Cuando un usuario en nuestro sitio pierde su contraseña y se dirige a la página Contraseña perdida, debemos darle una nueva contraseña temporal. Realmente no me importa cuán aleatorio sea esto, o si coincide con todas las reglas de contraseña fuertes "necesarias", todo lo que quiero hacer es darles una contraseña que puedan cambiar más adelante.
La aplicación es una aplicación web escrita en C #. así que estaba pensando en ser malo e ir por la ruta fácil de usar parte de un Guid. es decir
Guid.NewGuid().ToString("d").Substring(1,8)
Sugerencias? pensamientos?
Respuestas:
Siempre hay
System.Web.Security.Membership.GeneratePassword(int length, int numberOfNonAlphanumericCharacters
) .fuente
ASP.NET Core
?Esto tiene una buena ventaja de poder elegir de una lista de caracteres disponibles para la contraseña generada (por ejemplo, solo dígitos, solo mayúsculas o minúsculas, etc.)
fuente
Random
no es criptográficamente seguro;System.Security.Cryptography.RNGCryptoServiceProvider
Es una mejor opción.Los objetivos principales de mi código son:
La primera propiedad se logra tomando un módulo de valor de 64 bits del tamaño del alfabeto. Para alfabetos pequeños (como los 62 caracteres de la pregunta) esto lleva a un sesgo insignificante. La segunda y tercera propiedad se logran utilizando en
RNGCryptoServiceProvider
lugar deSystem.Random
.(Esta es una copia de mi respuesta a ¿Cómo puedo generar cadenas alfanuméricas de 8 caracteres al azar en C #? )
fuente
(También podría hacer que la clase en la que vive este método implemente IDisposable, mantenga una referencia al
RNGCryptoServiceProvider
, y lo deseche correctamente, para evitar crear instancias repetidamente).Se ha observado que, dado que esto devuelve una cadena de base 64, la longitud de salida siempre es un múltiplo de 4, y el espacio adicional se utiliza
=
como carácter de relleno. Ellength
parámetro especifica la longitud del búfer de bytes, no la cadena de salida (y, por lo tanto, quizás no sea el mejor nombre para ese parámetro, ahora lo pienso). Esto controla cuántos bytes de entropía tendrá la contraseña. Sin embargo, debido a que base-64 usa un bloque de 4 caracteres para codificar cada 3 bytes de entrada, si solicita una longitud que no sea múltiplo de 3, habrá un "espacio" adicional, y lo usará=
para llenar el extra.Si no le gusta usar cadenas de base 64 por algún motivo, puede reemplazar la
Convert.ToBase64String()
llamada con una conversión a cadena normal o con cualquiera de losEncoding
métodos; p.ej.Encoding.UTF8.GetString(tokenBuffer)
- solo asegúrese de elegir un conjunto de caracteres que pueda representar el rango completo de valores que salen del RNG, y que produzca caracteres que sean compatibles con donde sea que esté enviando o almacenando esto. Usar Unicode, por ejemplo, tiende a dar muchos caracteres chinos. El uso de base-64 garantiza un conjunto de caracteres ampliamente compatible, y las características de dicha cadena no deberían hacerla menos segura siempre que use un algoritmo de hash decente.fuente
Esto es mucho más grande, pero creo que se ve un poco más completo: http://www.obviex.com/Samples/Password.aspx
fuente
Sé que este es un hilo viejo, pero tengo lo que podría ser una solución bastante simple para que alguien la use. Fácil de implementar, fácil de entender y fácil de validar.
Considere el siguiente requisito:
La siguiente expresión regular puede validar este caso:
Está fuera del alcance de esta pregunta, pero la expresión regular se basa en mirar hacia adelante / mirar atrás y mirar hacia atrás .
El siguiente código creará un conjunto aleatorio de caracteres que coinciden con este requisito:
Para cumplir con el requisito anterior, simplemente llame a lo siguiente:
El código comienza con un carácter no válido (
"!"
), de modo que la cadena tiene una longitud en la que se pueden inyectar nuevos caracteres.Luego recorre en bucle de 1 a la cantidad de caracteres en minúsculas requeridos, y en cada iteración, toma un elemento aleatorio de la lista en minúsculas y lo inyecta en una ubicación aleatoria en la cadena.
Luego repite el ciclo para letras mayúsculas y para números.
Esto le devuelve cadenas de longitud =
lowercase + uppercase + numerics
en las que se han colocado en minúscula, mayúscula y caracteres numéricos del recuento que desea en un orden aleatorio.fuente
System.Random
para cosas críticas de seguridad como contraseñas. UsoRNGCryptoServiceProvider
lowers[random.Next(lowers.Length - 1)].ToString()
Este código nunca generará una 'z'. random.Next produce enteros menores que el número proporcionado, por lo que no debe restar ese extra de la longitud.Para este tipo de contraseña, tiendo a usar un sistema que probablemente genere contraseñas "usadas" más fácilmente. Corto, a menudo compuesto por fragmentos pronouncables y algunos números, y sin ambigüedad entre caracteres (¿es eso un 0 o un O? ¿A 1 o un I?). Algo como
(Escrito directamente en el navegador, así que úselo solo como guía. Además, agregue más palabras).
fuente
No me gustan las contraseñas que crea Membership.GeneratePassword (), ya que son demasiado feas y tienen demasiados caracteres especiales.
Este código genera una contraseña de 10 dígitos no demasiado fea.
Claro, podría usar un Regex para hacer todos los reemplazos, pero esto es más fácil de leer y mantener.
fuente
He creado esta clase que utiliza RNGCryptoServiceProvider y es flexible. Ejemplo:
fuente
Creé este método similar al disponible en el proveedor de membresía. Esto es útil si no desea agregar la referencia web en algunas aplicaciones.
Funciona muy bien
fuente
System.Random
para cosas críticas de seguridad como contraseñas. UsoRNGCryptoServiceProvider
Siempre estuve muy contento con el generador de contraseñas incorporado a KeePass. Como KeePass es un programa .Net y de código abierto, decidí investigar un poco el código. Terminé simplemente haciendo referencia a KeePass.exe, la copia proporcionada en la instalación de la aplicación estándar, como referencia en mi proyecto y escribiendo el código a continuación. Puedes ver cuán flexible es gracias a KeePass. Puede especificar la longitud, qué caracteres incluir / no incluir, etc.
fuente
fuente
Agregaré otra respuesta mal aconsejada a la olla.
Tengo un caso de uso en el que necesito contraseñas aleatorias para la comunicación máquina-máquina, por lo que no tengo ningún requisito para la legibilidad humana. Tampoco tengo acceso a
Membership.GeneratePassword
mi proyecto y no quiero agregar la dependencia.Estoy bastante seguro de que
Membership.GeneratePassword
está haciendo algo similar a esto, pero aquí puede ajustar los grupos de personajes para dibujar.Y algunos resultados de ejemplo:
Para evitar quejas sobre el uso de
Random
: La fuente principal de aleatoriedad sigue siendo el Crypto RNG. Incluso si pudieras predestinar de manera determinista la secuencia que saleRandom
(digamos que solo produjo1
), aún no sabrías el próximo carácter que se elegiría (aunque eso sería limitar el abanico de posibilidades).Una extensión simple sería agregar ponderación a los diferentes conjuntos de caracteres, lo que podría ser tan simple como aumentar el valor máximo y agregar casos fallidos para aumentar el peso.
Para un generador de contraseñas aleatorias más humanista, una vez implementé un sistema de solicitud utilizando la lista de palabras de dados EFF .
fuente
Me gusta mirar generar contraseñas, al igual que generar claves de software. Debe elegir entre una variedad de personajes que siguen una buena práctica. Tome lo que respondió @ Radu094 y modifíquelo para seguir las buenas prácticas. No ponga cada letra en la matriz de caracteres. Algunas letras son más difíciles de decir o entender por teléfono.
También debe considerar usar una suma de verificación en la contraseña que se generó para asegurarse de que fue generada por usted. Una buena forma de lograr esto es usar el algoritmo LUHN .
fuente
Aquí está lo que armé rápidamente.
fuente
Utilizo este código para generar contraseña con composición de saldo de caracteres alfabéticos, numéricos y no alfabéticos.
fuente
Esto es corto y funciona muy bien para mí.
fuente
En mi sitio web utilizo este método:
Editar cadena
_SymbolsAll
para su lista de matriz.fuente
Se agregó un código complementario a la respuesta aceptada. Mejora las respuestas simplemente usando Random y permite algunas opciones de contraseña. También me gustaron algunas de las opciones de la respuesta de KeePass, pero no quería incluir el ejecutable en mi solución.
Este fue el primer enlace cuando busqué generar contraseñas aleatorias y lo siguiente está fuera del alcance de la pregunta actual, pero podría ser importante considerarlo.
System.Web.Security.Membership.GeneratePassword
es criptográficamente seguro con un mínimo del 20% de los caracteres no alfanuméricos.fuente
validChars puede ser cualquier construcción, pero decidí seleccionar en función de los rangos de código ascii eliminando caracteres de control. En este ejemplo, es una cadena de 12 caracteres.
fuente
fuente
Random
como estáticaEste paquete le permite generar una contraseña aleatoria mientras indica con fluidez qué caracteres debe contener (si es necesario):
https://github.com/prjseal/PasswordGenerator/
Ejemplo:
fuente
Si desea utilizar la generación de números aleatorios criptográficamente segura utilizada por System.Web.Security.Membership.GeneratePassword pero también desea restringir el conjunto de caracteres a caracteres alfanuméricos, puede filtrar el resultado con una expresión regular:
fuente
fuente
Inserte un temporizador: timer1, 2 botones: button1, button2, 1 textBox: textBox1 y un comboBox: comboBox1. Asegúrate de declarar:
Código fuente:
fuente
System.Random
para seguridad.