Implementación de software de dados: ¿tengo que simular la tirada de dados?

14

Estoy creando una pequeña utilidad para generar contraseñas basadas en el método diceware. En este momento estoy muy cerca del algoritmo de software de dados real, es decir, simulo los dados de rodadura n-times para obtener una sola palabra de la lista.

Me pregunto si esto es realmente necesario. ¿No sería suficiente obtener un número aleatorio entre 0 y length(diceware_list) -1 para obtener una sola palabra?

¿Este enfoque simplificado afectaría la seguridad de la contraseña generada? (Estoy usando una fuente criptográficamente segura de números aleatorios, por lo que no es una preocupación).

Creo que el método simplificado debería estar bien, pero no estoy seguro. ¿Podría alguien ayudarme con eso, por favor?

    
pregunta MaciekTalaska 21.05.2018 - 16:46
fuente

4 respuestas

29

La razón por la que Diceware defiende el uso de dados para seleccionar una contraseña es que garantiza que la contraseña que obtiene el usuario se genera al azar . Así que no, siempre que esté seguro de que su programa está seleccionando la contraseña de una manera impredecible (selección aleatoria criptográficamente segura con una distribución uniforme), no importa cómo se genere realmente la contraseña.

Hay otras razones para usar los dados que son imposibles de replicar en cualquier programa:

  1. Es completamente transparente para el usuario. No tienen que confiar en un programa de computadora para usar un generador de números aleatorios criptográficos apropiado o para no filtrar su contraseña a actores maliciosos.
  2. 100% a prueba de malware. A menos que tenga una cámara web apuntando a su mesa mientras tira los dados, es físicamente imposible que un programa malicioso en su PC observe o influya en la contraseña que está generando.

Sin embargo, a menos que sus usuarios sean particularmente paranoicos, hay una buena probabilidad de que estén de acuerdo con renunciar a estos beneficios en favor de la conveniencia adicional de generar una nueva contraseña al instante.

    
respondido por el Ajedi32 21.05.2018 - 17:21
fuente
15

Sí, esto está perfectamente bien para hacer. Con un buen PRNG, cada elemento tendrá exactamente las mismas probabilidades de ser elegido, si hace la limitación (1 a n) correctamente. (He hecho personalmente una implementación de software de respuesta que hace exactamente eso .)

Hay dos razones simples por las que se usan múltiples dados en un proceso físico del conjunto de dados:

  1. Los dados de 6 lados son ubicuos y baratos.
  2. Un dado de 7776 caras (6 ^ 5) no existe, que yo sepa, existe. También sería incómodo rodar si es lo suficientemente grande para leer, o difícil de leer si es lo suficientemente pequeño como para rodar de la manera tradicional.

Tenga en cuenta que dije "si hace la limitación (1 a n) correctamente". Si su biblioteca de generación de números aleatorios no ofrece una primitiva de 1 a n, ¡ no simplemente tome un valor mayor y modulo n! Si bien esto dará respuestas en el rango correcto, no se distribuirán de manera uniforme. Usted debería:

  1. Continúe reintentando hasta que se devuelva un valor en el rango aceptable (es decir, descarte todos los valores > n)
  2. Escala linealmente: rand_val * n / rand_max (lo que requerirá cálculos matemáticos de precisión arbitraria para evitar el error de redondeo)
respondido por el David 21.05.2018 - 17:23
fuente
3

La respuesta de Ajedi32 es excelente. Quería enfatizar un detalle que puede ayudar a responder mejor su pregunta. La clave para asegurar la generación de contraseñas es asegurarse de que su contraseña sea impredecible . No es "aleatorio". La idea de azar viene después. El objetivo es impredecible. Si lo piensas bien, la contraseña más segura que existe no es aleatoria, es cualquiera que sea la última contraseña que el atacante suponga. Es el que no pudieron predecir.

Ahora, en la práctica, hay un juego del gato y el ratón aquí. Si intentas encontrar la contraseña más impredecible, intentarán predecir cómo se generan las contraseñas. Esta es la razón por la que las contraseñas como qazxswedc parecen aleatorias, pero una vez que descubran lo que estaba haciendo para generar la contraseña, la romperán con facilidad.

Aquí es donde finalmente entra la aleatoriedad. Para la criptografía moderna, nos esforzamos por usar números que no solo son impredecibles para el atacante, sino imprevisibles para cualquiera , ¡incluyéndote a ti! Los números aleatorios son números que literalmente no se pueden predecir de ninguna manera. Solo puede saber qué números se eligieron si estaba viendo cuando se generaron los números. La aleatoriedad significa que puedes hacer afirmaciones matemáticas sobre lo difícil que es predecir una contraseña, porque ni tú mismo, tuviste el control de la generación.

Durante miles de años, los dados han sido una fuente "estándar" de números aleatorios. Hay muchos otros (la adivinación I Ching, por ejemplo, tradicionalmente usaba un paquete de palos de milenrama), pero los dados han persistido durante mucho tiempo. Si se lanzan correctamente (¡no hay helicópteros!), Son fuentes de números aleatorios suficientemente buenas porque el rebote del dado es altamente caótico e impredecible. Necesitarías telekenesis para afectar los resultados (piensa en Star Wars: The Phantom Menace).

Si está preocupado por los dados cargados, como lo mencionaron algunos en los comentarios, puede hacer un análisis estadístico para determinar cuántos bits de entropía por tirada puede confiar. La generación de contraseñas es menos sensible a los dados cargados que a los casinos (siempre se pueden hacer tiradas adicionales, multiplicando el número de posibilidades. Debido a que los casinos reparten dinero, no pueden multiplicar cada ronda, tienen que sumar. Esto los hace más sensible).

Así que ahora podemos acercarnos más a su pregunta, porque entendemos lo que está tratando de lograr. La simulación de los dados en realidad no funciona tan bien como podría pensar, porque la simulación hará lo mismo cada vez, a menos que tenga una fuente de aleatoriedad incorporada en el simulador, que tipo de derrota el punto.

La pregunta es: ¿en qué fuente aleatoria puedes confiar? Aquí es donde tienes que entender tu modelo de amenaza. ¿Qué puede hacer tu atacante? ¿Puede su atacante leer sus pulsaciones? Si es así, tiene problemas porque tendrá que escribir la contraseña. Entonces, prácticamente hablando, podemos suponer que el atacante no tiene suficiente control sobre su máquina para poder leer las pulsaciones de teclas.

Puedes seguir trabajando desde allí. Supongo que su modelo de amenaza supone que su computadora es prístina, en cuyo caso puede confiar en fuentes de entropía probadas con el tiempo, como /dev/random . En este caso, la mejor respuesta es extraer de esa fuente y usarla directamente (no se requiere simulación de dados).

Si está más preocupado por la seguridad, puede ver otros aspectos. Algunos algoritmos tienen problemas con los ataques de canal lateral que permiten que un atacante se asome a su estado en algunas circunstancias especializadas, por lo que podría endurecer su algoritmo contra esos. Puede decidir que no confía en las fuentes normales de entropía en una computadora (como el tiempo entre las pulsaciones de teclado y la actividad de la red), por lo que podría invertir en una fuente de hardware aleatoria (a menudo basada en el ruido en una red de resistencias). / p>

Pero no importa a dónde vayas con eso, recuerda que la clave es ser impredecible, y la forma estándar de asegurarte de que tu oponente no pueda predecirte es ser tan aleatorio que no puedas predecirte a ti mismo.

    
respondido por el Cort Ammon 22.05.2018 - 17:35
fuente
1

Un generador de números aleatorios se considera "pseudoaleatorio", no es realmente aleatorio, ya que se calcula matemáticamente. Los dados son considerados verdaderamente aleatorios, aunque supongo que podrías argumentar que la física no es diferente ...

Al simular la tirada de dados programáticamente, estás eliminando la aleatoriedad real que requiere el software de dados. Por lo tanto, su confusión entre los dados simulados y la selección de una palabra aleatoria, ambos son pseudoaleatorios.

    
respondido por el rtaft 22.05.2018 - 18:39
fuente

Lea otras preguntas en las etiquetas