Semilla aleatoria confiable para RNG

4

Quiero crear mis contraseñas de computadora con un RNG, pero estoy pensando en una cosa: usaría python para escribir ese script y el RNG está controlado por una semilla, probablemente el tiempo. Si generara mis contraseñas con un RNG que esté sembrado con el tiempo y alguien lo sepa, él podría intentar forzar las contraseñas generadas mediante el uso del tiempo en el que posiblemente creé las contraseñas.

En pocas palabras, en mi opinión, el tiempo no es una buena semilla para un RNG si la salida debe permanecer en secreto, pero ¿cuáles son las buenas semillas para un RNG? Ya escuché de ideas como leer la memoria asignada (si solo se asignó, debería contener bytes aleatorios), usando el PID actual o usando los últimos bits de la posición del cursor del mouse. ¿Cuál de estas ideas (u otras ideas) es realmente completa al azar?

    
pregunta Sirac 29.05.2014 - 00:44
fuente

2 respuestas

3

Esto depende de la plataforma.

Como un caso general, debería considerar el uso de los enlaces de OpenSSL para usar la API RAND_ * de OpenSSL. Asegúrese de inicializarlo correctamente. No leer la documentación de OpenSSL causará un compromiso de seguridad en prácticamente todos los sistemas operativos debido a una inicialización incorrecta de RNG. Incluso los "grandes" han sido mordidos por esto.

En sistemas operativos similares a Unix que incluyen BSD, Hurd y Mac OS X, debe leer desde /dev/arandom (si existe), o /dev/urandom (si existe), o /dev/random ( only si no existe ninguno de los otros dos). Si no existe ninguno de estos ① y ② son dispositivos de caracteres, deténgase con un error para evitar el compromiso. ¡Realmente no quieres "inventar" un esquema RNG / de siembra!

En los sistemas Windows® ... primero considere si realmente quiere hacer esto. Esto ya es un compromiso de seguridad potencial. Luego, lea desde /dev/urandom si existe (Cygwin), o use CryptGenRandom API. No estoy seguro de que haya enlaces de Python, pero no es difícil hacerlo en C, y se puede convertir en un módulo compilado de Python. Tal vez con FFI ...

Cuando use OpenSSL, considere establecer RANDFILE para mantener una semilla en todas las invocaciones de programas, especialmente en Windows®. Considere prescribir esto desde una buena entropía conocida. Tal vez mezclando cosas del servicio Hotbits de random.org , randomnumbers.info o fourmilab.ch (pero, de nuevo, no tome solo desde allí, ya que se transmite a través de la red). Tenga en cuenta que OpenSSL no maneja correctamente el RANDFILE : en lugar de leer + RAND_add + write + close en el inicio del programa, normalmente se lee al inicio del programa y se escribe solo al final del programa; esto es mejor pero solo si su programa (y todos los demás programas que lo usan) no se ejecutan más de una instancia en un momento dado.

No uses ninguno de estos:

  • ID de proceso
  • tiempo
  • Posición del ratón
  • contenido de la pantalla
  • Contenido de la memoria "sin inicializar": a menudo no está sin inicializar (incluso los resultados de malloc() , que la biblioteca C puede que no se inicialice, es inicializado por el sistema operativo por la única razón de borrar lo que había antes (por ejemplo, de otro proceso), y la forma más sencilla de eliminarlo es ponerlo en cero), y si es, este es normalmente un comportamiento indefinido, que puede llevar a todo tipo de caos

Es cierto que estas son (algunas de) las fuentes de entrada utilizadas por el sistema operativo y / o OpenSSL para sus implementaciones de RNG. Pero estas personas saben (más o menos, pero un poco más que usted) lo que están haciendo y, lo que es más importante, no son las únicas fuentes. No todos son secretos, y un atacante puede experimentar con ellos. Más importante aún, su rango de valor no es grande. Además, no escriba ningún código de "entrada de teclado" (valores y tiempos) usted mismo. El sistema operativo maneja la conversión de pulsación de tecla a la entropía, normalmente. Solo pida al sistema operativo una buena entropía, y falle si no hay alguno.

No use el generador de números aleatorios de hardware del sistema como única fuente! Pueden estar comprometidos. Además, puede que ni siquiera existan, o que el acceso esté prohibido (piense en máquinas virtuales).

Mezclar cualquiera de estos en un grupo es bueno, pero nuevamente, el sistema operativo hará un mucho mejor trabajo que la aplicación de espacio de usuario.

    
respondido por el mirabilos 30.05.2014 - 17:49
fuente
2

Python proporciona la función os.urandom() para leer los bytes del OS CSPRNG mencionado por Stephen Touset arriba.

Para la API del módulo random más atractiva, también proporciona la clase random.SystemRandom() que usa la misma fuente.

No hay razón para hacer algo más complicado.

  

Ya escuché ideas como leer la memoria asignada (si solo se asignó, debería contener bytes aleatorios) ...

Por cierto, esto llevó a uno de los más desastres de seguridad infames en la memoria reciente . (Bueno, antes de 2013, de todos modos.) El CSPRNG de OpenSSL usó la memoria no inicializada como una fuente adicional cuestionable de "entropía", no la fuente solo , por supuesto, pero no podría hacer nada al mezclarla. ? En 2006, un desarrollador de Debian se cansó de las advertencias de Valgrind que esto produjo y deshabilitó esa línea de código. Malinterpretando el código no intuitivo de OpenSSL, también deshabilitaron inadvertidamente todas las otras otras fuentes de entropía excepto el PID , por lo que durante dos años los usuarios de Debian, Ubuntu y la compañía obtuvieron solo 32,767 " "corrientes aleatorias".

    
respondido por el Matt Nordhoff 31.05.2014 - 01:05
fuente

Lea otras preguntas en las etiquetas