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.