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.