¿Generar una clave de cifrado mediante el generador de números aleatorios en la computadora representa un riesgo para la seguridad? Si es así, ¿cómo podría mitigarse ese riesgo, específicamente al generar pares de claves RSA en .Net?
¿Generar una clave de cifrado mediante el generador de números aleatorios en la computadora representa un riesgo para la seguridad? Si es así, ¿cómo podría mitigarse ese riesgo, específicamente al generar pares de claves RSA en .Net?
El uso de generadores de números aleatorios de computadora para producir claves, ¿es seguro?
Depende de su entorno de amenazas, exposición y seguridad general del sistema. Dada la dificultad de implementar sistemas seguros y robustos, y suponiendo que lo que está protegiendo no es de gran valor (para otros), es probable que utilice su propia computadora para generar números aleatorios. Sin embargo, si la amenaza para su sistema es alta, su exposición es grande y la cosa que está protegiendo tiene un valor alto, entonces no, el uso de números aleatorios generados por computadora es inseguro.
¿Genera una clave de cifrado con el generador de números aleatorios en la computadora? presentar un riesgo de seguridad?
Sí, pero puede que no sea un riesgo lo suficientemente significativo como para hacer algo al respecto. Vea la siguiente parte de la respuesta.
Si es así, ¿cómo podría mitigarse ese riesgo, específicamente al generar RSA? pares de claves en .Net?
En el cifrado RSA, la clave privada y la clave pública están relacionadas matemáticamente. Se necesitan números aleatorios para generar el par de claves público-privadas. Si un atacante tuviera los números aleatorios utilizados para generar el par de claves y la clave pública, podría encontrar fácilmente la clave privada.
Microsoft .NET Framework proporciona RNGCryptoServiceProvide para la generación de números aleatorios. Todos los generadores de números aleatorios basados en software son en realidad generadores de números pseudoaleatorios. Lo que significa que no son realmente aleatorios, pero producen resultados de una manera que hace que los resultados parezcan aleatorios.
Todo el software es determinista. Lo que significa que para un conjunto dado de entradas, la salida se puede determinar exactamente. Esto es malo para prng (generadores de números pseudoaleatorios), porque producirían un resultado predecible. es decir, la salida ni siquiera sería pseudoaleatoria. Para superar esta limitación, los prng necesitan datos aleatorios de inicio para comenzar.
Al darle a la función prng un poco de datos aleatorios para comenzar, se pueden generar muchos números pseudoaleatorios. Hay muchos métodos para generar datos de semilla aleatorios: usar el tiempo que se llamó a la función, leer un bloque de memoria no inicializada, usar el tiempo promedio entre pulsaciones del teclado, la posición del mouse, etc. Generalmente, los datos utilizados para generar el azar Sembrarlo tampoco es perfectamente aleatorio.
Si un atacante conocía el algoritmo utilizado para producir los números aleatorios y los datos de inicio, puede reducir las salidas posibles del prng y utilizar la salida de configuración reducida para encontrar fácilmente su clave privada.
No sé qué algoritmo rpng utiliza RNGCryptoServiceProvide, por lo que no puedo hablar de su eficacia.
Para mitigar el riesgo debido a la generación de números aleatorios, puede usar verdaderos generadores de números aleatorios basados en hardware. Los generadores de números aleatorios basados en hardware no requieren una semilla, porque en lugar de un algoritmo usan un proceso físico para generar sus datos. Ciertos procesos físicos tienen características aleatorias o casi aleatorias: la descomposición de una partícula radioactiva, el ruido térmico, las condiciones de carrera en los transistores, etc. La salida de los generadores de números aleatorios basados en hardware será estadísticamente más aleatoria que los números generados por su computadora. Además, no se utiliza ningún valor disponible en su computadora para generar la salida. Sin embargo, muchos generadores de números aleatorios de hardware son caros y lentos.
Entonces, ¿el costo en dinero y velocidad valdría la inversión?
Depende de lo que esté protegiendo y de lo sofisticados y determinados que puedan ser sus atacantes.
Nota: algunos conjuntos de chips de computadora ahora incluyen generadores de números aleatorios de hardware.
¡Si estás en Londres, deberías haber venido a las dc4420.org reuniones mensuales este año! ¡Tres charlas sobre generadores de números aleatorios y estamos en junio!
Una de las conversaciones fue de IDQ y otra de un consultor que analiza los generadores de números aleatorios para los sitios de Casino y Poker en línea (tipos que realmente se preocupan por la aleatoriedad). Esto es lo que aprendí:
Cuando se trata de generadores de números aleatorios, no hay necesidad de mirar más allá de Quantis . Es relativamente económico y es rápido y confiable. Es de IDQ, que dice que está siendo utilizado por el gobierno de Ginebra.
El segundo mejor es el mecanismo basado en hardware. Para un poco de diversión con la fuente radioactiva de un detector de humo, una cámara web y algo de python (por menos de £ 20), compruebe esto: enlace
Nota: esto es divertido. La piratería no está utilizando la fuente probada de aleatoriedad, ya que es el momento entre las partículas de radiación, por lo que puede no ser realmente aleatoria (aunque probablemente más que el software). Debe tomarse como un experimento divertido en lugar de un uso de producción.
Evaluación de la calidad de los generadores de números aleatorios:
Lo peor es el software basado en generadores de números pseudoaleatorios que utilizan fuentes cuasi de "aleatoriedad" como la CPU actual y el peor momento. Use estos solo si el activo que está protegiendo y las amenazas que enfrenta están de acuerdo con, por ejemplo. Java Dev aleatorio.
Supongo que te refieres a los PRNG de HW disponibles en algunos conjuntos de chips.
En general, debe utilizar la función PRNG del SO. Intentan producir buena aleatoriedad. Una vez vi una charla sobre el diseño de PRNG de FreeBSD, e integraron el PRNG de hardware del conjunto de chips para que, en el peor de los casos, no agregue aleatoriedad pero tampoco debilite el PRNG del sistema. Sin embargo, también apreciaría más recursos / confirmación / generalización sobre este tema.
Tenga en cuenta que el TPM también proporciona un HW PRNG. Google puede decirte cómo usarlo. El "Análisis del generador de números aleatorios de Linux" también puede tener algunos indicadores interesantes.
Si no confía en su PRNG, puede intentar ejecutar algunos paquetes de prueba de PRNG. Sin embargo, ninguno de estos puede decirle si su PRNG es, de hecho, aleatorio o solo pseudoaleatorio.
Para este tipo de aplicación (que genera claves bastante pequeñas), la mayor preocupación es que el PRNG no se pueda sembrar con suficiente entropía, si las entradas al PRNG son predecibles, también lo son las salidas. Probablemente el ejemplo reciente más famoso de esto fue en la versión de Debian de OpenSSL (entre septiembre de 2006 y el 13 de mayo de 2008): la única fuente de entropía que utilizó fue el ID de proceso del programa generador, por lo que solo había 32.768 claves posibles (y algunos eran más probables que otros). (Ref: Aviso de seguridad de Debian DSA-1571-1 y discusión aquí .)
Esto no fue un incidente aislado. Esta bibliografía enumera 4 ejemplos en sus 'Serios defectos en los PRNG utilizados en la sección "aplicaciones del mundo real" (y no parece haber sido actualizado en una década). Otro ejemplo: Samy Kamkar mostró cómo descubrir suficientes fuentes de entropía para una clave de sesión de PHP (antes de la versión 5.3.2) para haga que sea fuerte forzoso .
En general, creo que el mejor enfoque es utilizar un generador de números aleatorios destinado a la generación de claves (especialmente uno que se encargue de la recopilación de entropía para usted), de un desarrollador en el que confíe que haya prestado atención.
Lea otras preguntas en las etiquetas cryptography encryption random .net