2012-05-03 3 views
5

Muy a menudo veo .NET class Random que se utiliza para la generación de contraseñas.¿Cómo demuestro que la clase .NET aleatoria no es adecuada para generar contraseñas?

Por un lado, this question I asked earlier muestra que generar un grupo de datos "secretos" usando class Random produce datos bastante predecibles. Por otro lado, actualmente estoy tratando de realizar esa predicción exacta y mi código funciona a una velocidad de aproximadamente seis millones de conjeturas por día en un solo núcleo, no extremadamente rápido, tomará casi un año enumerar todos los valores iniciales posibles a ese ritmo.

¿Existe alguna forma más clara y más rápida de mostrar que las contraseñas generadas con los datos de class Random() son mucho más débiles de lo que se esperaba normalmente?

+5

¿Por qué no simplemente mostrarles la respuesta de Eric Lippert y la pregunta que vinculó? Incluso muestra un ejemplo de generación de números aleatorios criptográficos: si intenta convencer a las mentes de los negocios, simplemente mencionar la palabra criptográfica debería funcionar: --P –

+0

Creo que tiene la lógica al revés. Si hay una aplicación que es crítica para la seguridad, la carga está en aquellos que proponen una solución para demostrar que la solución cumple con los requisitos de seguridad. Dudo que alguien pueda hacer esto por la clase aleatoria de .NET. Los PRNG utilizados en aplicaciones de cifrado tienen propiedades de seguridad definidas, por lo que es posible demostrar que cumplen con los requisitos definidos. –

Respuesta

0

Según mi entender, la clase Random genera valores aleatorios basados ​​en un "algoritmo Psuedo-aleatorio", por lo que en realidad no son aleatorios. se basan en una implementación concreta de un algoritmo matemático, por lo que los resultados son predecibles.

Así que si estaba tratando de romper este algoritmo, por una brecha de seguridad, no es que lo haga, necesito saber cierta información: sé cuál es el algoritmo, es públicamente accesible a través del framework .Net, ¿cuál es la valores de entrada (la semilla)?

Una vez más, no puede simplemente aumentar estos valores de entrada, deben basarse en algo, ¿y qué?

En su ejemplo, intenta, como yo lo entiendo, generar todos los valores iniciales posibles. ¡Esto como dijiste tarda mucho tiempo!

¿Pero por qué iba a hacer esto? el enfoque más inteligente es intentar adivinar lo que usas para generar tus valores de entrada? es decir, ¿estás usando el tiempo? ¿Cuándo se restablecen las contraseñas? ¿Cuándo se generó esta contraseña? ¿Qué subconjunto de valores me da esto? ¿Qué tan grande estás usando?

Si puede probar 6 millones de semillas en un día, ¿cuántos valores aplica la lógica reduce el conjunto de valores posibles? Si es < 6 millones podría romper su contraseña en 24 horas.

Dicho eso, si puedes hacer que tu subconjunto de semillas sea lo suficientemente grande e impredecible, entonces esto es difícil. Entonces, la pregunta, como muchas cosas relacionadas con la seguridad, ¿qué tan seguro debe ser esto? ¡Nada es 100%!

+1

Sin embargo, sus primeros tres párrafos se aplican a todos los RNG comúnmente en uso, ¿no? Si tengo tu algo y tu semilla, puedo obtener el siguiente valor. – Cylindric

+0

Es cierto, pero la complejidad es un problema aquí. ¿Pero al azar solo tiene una sola llave? No es muy complejo, por lo que la lógica necesaria para adivinar esa clave es más fácil. No está diseñado para la generación de contraseñas aleatorias. Algo así como un hash MD5 está diseñado para el cifrado, por lo que es más complejo, tiene múltiples claves, etc. por lo que la lógica necesaria para replicar el resultado es mucho más compleja – Liam

+1

Si usa MD5 para todo lo relacionado con contraseñas y/o Encriptación, es mejor que no te molestes. – Cylindric

0

En su pregunta original, nadie dice que Aleatorio no es bueno para generar contraseñas aleatorias (de hecho, la palabra "contraseña" no aparece en ninguna parte de la pregunta, las respuestas o los comentarios). Te resultará difícil probar esto porque, para ello, el sistema deberá generar varias contraseñas aleatorias a la vez. Además, el atacante tendrá que hacer coincidir el nombre de usuario y la contraseña de alguna forma, incluso si logra obtener una buena cantidad de contraseñas.

1

Déjenme decirlo de esta manera: elija un generador de números aleatorios que sea adecuado para la cantidad de contraseñas que desea generar. Con un tamaño de alfabeto de 36 (dígitos y solo mayúsculas o minúsculas), extrae solo una pequeña fracción del estado interno del RNG. E incluso si genera 40000 caracteres de esa manera, eso solo significa 21 bits de información. Su algoritmo en la otra pregunta solo genera 4 caracteres aleatorios además del prefijo. Sería más fácil para un atacante aplicar fuerza bruta a todas las contraseñas posibles en lugar de forzar el estado RNG para poder descubrir la siguiente contraseña que se generará.

En realidad, el peor error que puede hacer al usar un RNG simple para generar contraseñas es generar una gran cantidad de ellos. Si solo los genera a demanda y siempre con un RNG recién sembrado, un atacante tendrá dificultades para calcular la semilla y, por lo tanto, la contraseña. La implementación predeterminada de System.Random toma el tiempo transcurrido desde que el sistema se inicia en milisegundos como semilla. Buena suerte descubriéndolo.

Cuestiones relacionadas