¿Los humanos son un RNG fuerte o débil? [duplicar]

23

Thomas Pornin tiene declarado en el pasado en múltiples ocasiones (no voy a buscarlos, él puede discutir conmigo si lo desea) que los humanos son malos RNG.

Aunque estoy de acuerdo en que el RNG humano para la generación de contraseñas en la mente suele ser abismal, quería preguntar si el RNG asistido por un humano por computadora es igualmente malo. KeePass tiene una función en la que siembra el RNG moviendo el mouse por un tiempo, y aunque sé que si KeePass está usando / dev / urandom es más o menos seguro, he usado el RNG sembrado con el mouse en el pasado.

Siempre he pensado que el RNG ayudado por la intervención humana sería mejor que el PRNG estándar proporcionado por un sistema operativo. ¿Cómo podría alguien predecir exactamente cómo movería mi mouse, a qué velocidad, con qué frecuencia me detengo, etc.?

    
pregunta Naftuli Kay 15.01.2015 - 20:05
fuente

7 respuestas

44

Los cerebros humanos son pobres RNG. Las personas son malas para generar valores aleatorios en la privacidad de sus cabezas. Simplemente no pueden pensar al azar; aunque pueden convencerse a sí mismos de que lo hacen.

El proceso físico, por otro lado, es una buena fuente de entropía. Toma los movimientos de tu ratón. Una docena de veces por segundo, el mouse mide la distancia que se ha movido desde la última marca y envía esa información al servidor. Cuando su mano tiembla, tiende a hacerlo con cierta regularidad, pero la biología es tal que cada movimiento elemental estará sujeto a cierta fluctuación, que es sustancialmente más grande que la precisión del mouse; incluso con mucho entrenamiento, es muy difícil para una mano humana hacer el mismo movimiento repetidamente (de lo contrario, habría muchas más personas como Yehudi Menuhin ). Así que la conclusión es que las medidas de movimiento del mouse contienen algo de entropía. (Recuerde que la "entropía" se define aquí como "aquello que el atacante no sabe"; el mouse ciertamente sabe cuánto se ha movido, ya que es ese mouse el que realmente envía los valores en los que se basa el RNG).

La otra mitad de la respuesta es agregación . Un RNG basado en ratón utilizará cientos o incluso miles de medidas, las acumulará todas y las condensará en una semilla apropiada que concentrará toda esa entropía. Esto es bastante simple: simplemente alimente todos los valores a una función criptográfica hash, por ejemplo. SHA-256, y obtendrás una semilla de 256 bits que tiene toda la entropía de origen, donde sea que estuviera escondida en los movimientos medidos del mouse. Las funciones hash son buenas para eso; reducen el tamaño pero mantienen la entropía (hasta el tamaño de salida de la función hash, pero 256 bits es más que suficiente para todos los propósitos).

Un atacante puede adivinar que el usuario hará círculos, pero tendrá dificultades para hacer todos los movimientos individuales correctamente, especialmente porque la psicología no lo ayudará: el propio usuario humano no tiene idea de cómo se convierten los movimientos de sus manos. números. Ya que estamos hablando de cientos de números, el número de combinaciones posibles (es decir, "entropía") aumenta exponencialmente. Contrasta eso con un usuario humano que piensa en una nueva contraseña: el usuario elegirá las letras siguiendo algún pensamiento interno "ingenioso", que el atacante puede adivinar más o menos brutalmente (por ejemplo, si las letras son todas las primeras letras de algunas palabras en una oración de un libro, el atacante puede probar automáticamente todas las oraciones de todos los libros que puede encontrar en formato electrónico); y, lo que es más importante, al usuario humano no se le molestará en producir más de una docena de personajes "aparentemente aleatorios".

En las contraseñas, la longitud no hace fuerza, pero la falta de longitud puede ser bastante efectiva para prevenir la fuerza.

    
respondido por el Thomas Pornin 15.01.2015 - 22:06
fuente
4

Los seres humanos son generadores de aleatoriedad muy pobres, especialmente a petición.

La mayoría de los usuarios van a hacer una de las pocas cosas ya que el comportamiento humano es bastante predecible. Usando el mouse como ejemplo, es probable que los usuarios lo muevan de lado a lado o hacia arriba y hacia abajo hasta que se genere suficiente "aleatoriedad" según el programa. Quizás lo muevan en un círculo. Lo que es poco probable que hagan es mover el mouse de una manera verdaderamente aleatoria. Si a alguien le importara, podrían analizar un conjunto de usuarios, extrapolar comportamientos probables y extraer información útil de esos estudios para descubrir patrones que podrían usarse para atacar un sistema de este tipo.

Es realmente difícil obtener datos verdaderamente aleatorios.

Del libro de cocina de programación segura para C y C ++: desafortunadamente, la mayoría de los movimientos del mouse siguen trayectorias simples con muy poca entropía. La mayor parte de la entropía se produce cuando el puntero alcanza la vecindad general de su destino y comienza a disminuir la velocidad para bloquear un objetivo. También suele haber un poco de entropía en el arranque. El movimiento intermedio suele ser bastante predecible. No obstante, si los ataques locales no están en su modelo de amenaza, y el atacante solo puede adivinar aproximadamente a qué partes de la pantalla se dirigió el mouse en un marco de tiempo particular basado en observar el comportamiento del programa, hay potencialmente un poco de entropía en cada mouse. evento, porque el atacante no podrá adivinar el píxel donde se encuentra el cursor en un momento dado.

    
respondido por el Devon Holcombe 15.01.2015 - 21:00
fuente
2

Con la siguiente secuencia de comandos de Python, intente producir una secuencia de 42 ceros o unos moviendo el mouse en un patrón 'repetible'.

import Tkinter

root = Tkinter.Tk()

lx,ly = (0, 0)
while True:
        x,y = root.winfo_pointerxy()
        if ((x-lx)**2+(y-ly)**2) > 42:
                print (x ^ y ^ lx ^ ly) & 1
                lx,ly = (x,y)

Si tiene Python 3.x, también puede usar lo siguiente:

import tkinter
tkinter.NoDefaultRoot()
root = tkinter.Tk()
x = y = 0
while True:
    x2, y2 = root.winfo_pointerxy()
    if (x - x2) ** 2 + (y - y2) ** 2 > 42:
        print((x ^ y ^ x2 ^ y2) & 1)
        x, y = x2, y2
    
respondido por el Bertl 16.01.2015 - 02:22
fuente
1

La calidad de un RNG es una cuestión de correlaciones con las entradas o algún otro conjunto de parámetros no secretos. Obviamente, si la salida de un RNG se correlaciona con algo que usted conoce, eso reduce drásticamente la entropía al permitirle eliminar grandes franjas del posible espacio de salida; tal vez se pueda esperar que un RNG dado sea realistamente para producir solo uno de cada 1,000 números como a diferencia de los 1.000.000 anunciados, lo que hace que la fuerza bruta sea mucho más práctica.

El RNG construido por pidiendo a un humano que piense en palabras o frases al azar es, de hecho, pobre. La razón es que muchos correlatos fuertes:

  • Correlación con la cultura, lo que le permite usar un diccionario de inglés para objetivos de América del Norte o centrarse en 1900-2000 para los PIN (también es la razón por la que las contraseñas en otros idiomas son una estrategia decente de seguridad a través de la oscuridad)
  • Correlación con otros, lo que le permite crear diccionarios de las X contraseñas más comunes de la parte superior
  • Correlación con el comportamiento histórico del yo, lo que le permite explotar contraseñas pasadas conocidas o extraer las redes sociales para obtener pistas como la fecha de nacimiento o la ciudad natal

Tenga en cuenta que muchos PRNG "seguros" también se basan en una entrada muy predecible, a saber, la hora del sistema.

La clave es reconocer que el humano no es necesariamente el único elemento del RNG. Solo actúa como una semilla. No hay ninguna razón por la cual se le permitiría solo generar la semilla tal como está, por lo que puede aplicarle varias funciones para diluir la correlación (un ejemplo básico pero débil es agregar un número muy grande, multiplicar por un número muy grande y luego tomar el modulo).

Los movimientos del mouse solo se usan como una semilla para el RNG de Keepass. Si la función que utilizan es razonablemente capaz de devolver información no correlacionada, no hay razón para sospechar que no es segura. (concedido, no podría decirle por qué exactamente no se saltan el mouse y usan el tiempo del sistema como su semilla, o qué función usan exactamente y qué tan seguro es)

    
respondido por el Superbest 16.01.2015 - 01:45
fuente
0

Creo que los humanos están bien, pero depende de cómo les pidas que generen el número. ¿También están obligados a poder replicarlo? Para números más pequeños, los humanos son fácilmente influenciados y altamente predecibles. También existe el problema de que los humanos a menudo comenzarán con patrones similares antes de que realmente comiencen a generar algo que se parece al azar. Tome el siguiente ejemplo

952167493 ... al comienzo, comencé con un número familiar, tal vez un número de teléfono que está en la mente de la persona o en el número de la calle, luego los humanos podrían tratar de ser aleatorios, y la posibilidad de que dos números sigan un orden de conteo regular será bajo, después de esto podrían saltar tratando de completar el espectro numérico.

dado suficientes muestras, creo que muchos humanos seguirían patrones similares, y obtendrías grandes números que no son en absoluto aleatorios. Incluso puedes encontrar franjas enteras de números que no aparecen, simplemente porque no se sienten aleatorios con un humano mientras los crean, como 123123123123123 o 44455523534333666

No confiaría en un humano para crear un número aleatorio a menos que tuvieran algunas instrucciones que disminuyeran la probabilidad de sesgos humanos de número / patrón, incluso entonces es una mala idea

    
respondido por el catsquid 15.01.2015 - 21:24
fuente
0

Ya hay algunas respuestas muy buenas aquí, así que solo quiero proporcionar algunas pruebas anecdóticas. Parece claro ya que los RNG basados en movimiento los humanos pueden proporcionar una fuente fuerte de entropía debido a la reproducción inexacta de los movimientos.

Sin embargo, en el caso de pedir a los humanos que seleccionen un número aleatorio, comienzan a mostrarse tendencias fuertes. Recuerdo una clase de matemáticas en el año 8 en la que generamos 100 números "aleatorios" al preguntar a las personas con las que nos encontramos y los resultados mostraron cuán predecibles pueden ser los humanos. No puedo recordar los resultados exactos, pero el número 7, por ejemplo, apareció tres veces más a menudo que la siguiente respuesta más popular, ninguna persona dio una respuesta de más de dos dígitos y todas las respuestas eran números enteros. Estoy seguro de que si esto se realizó en una escala mayor se produciría una tendencia similar.

    
respondido por el alexmann1234 16.01.2015 - 10:42
fuente
0

En mi opinión, los humanos son muy pobres en la generación de aleatoriedad a petición. Hay formas de "extraer" aleatoriedad de las interacciones humanas. El movimiento del ratón es un buen ejemplo. La aleatoriedad no proviene de las intenciones del usuario (la mayoría de las personas dibujarán líneas o círculos), sino del error en el movimiento. Los seres humanos simplemente no pueden dibujar figuras exactamente repetibles con un ratón.

Mientras buscaba respuestas, encontré dos artículos 'interesantes':

  • Los seres humanos pueden generar conscientemente secuencias de números aleatorios: una posible prueba para inteligencia artificial. ]
  • Los seres humanos no pueden generar secuencias de números aleatorios de manera consciente: estudio de la Polémica [ 2 ]

Lamentablemente, ambos solo están disponibles comercialmente, y si no eres estudiante o investigador en alguna universidad, deberías pagar. (¡No lo hagas por estos papeles!) Creo que los títulos son lo suficientemente divertidos.

También encontré artículos más serios e interesantes, puedes leer:

  • Juegos para extraer aleatoriedad [ 3 ]
  • Evaluación de la aleatoriedad y la complejidad en las trayectorias de movimiento humano mediante el análisis de secuencias simbólicas [ 4 ] ( no totalmente en el tema, pero muy interesante)
  • Esta respuesta en el intercambio de pila de ciencias cognitivas enumera algunas

Todo esto sugiere (excepto el primer artículo, pero no me tomo eso muy en serio) que los humanos son malos cuando se les pide que generen aleatoriamente conscientemente, pero si lo haces bien, ¡puedes extraer una buena aleatoriedad de los movimientos humanos!

    
respondido por el Josef 16.01.2015 - 11:26
fuente

Lea otras preguntas en las etiquetas