¿Es necesario, superfluo o dañino el siguiente código de siembra de PRNG de OpenSSL?

2

Mientras revisaba Crypt :: SSLeay , preparándolo para el próximo lanzamiento, noté el siguiente código: Manera escrita antes de mi tiempo,

...

int rand_bytes_read;
static int bNotFirstTime;
char buf[ 1024 ];

...

if(!bNotFirstTime) {
    SSLeay_add_all_algorithms();
    SSL_load_error_strings();
    ERR_load_crypto_strings();
    SSL_library_init();
    bNotFirstTime = 1;
}

/**** Code from ..., 10/3/2002 ****/
/**** Use /dev/urandom to seed if available  ****/
rand_bytes_read = RAND_load_file("/dev/urandom", 1024);
if (rand_bytes_read <= 0) {
    /* Couldn't read /dev/urandom, just seed off
     * of the stack variable (the old way)
     */
    RAND_seed(buf,sizeof buf);
}

Primero, me parece que la forma correcta de verificar si RAND_load_file tuvo éxito es verificar si los bytes leídos son iguales a los bytes solicitados.

Dejando eso de lado, entiendo que SSL_library_init siembra el PRNG de /dev/urandom si está disponible, y de otras fuentes en Windows, etc.

  • ¿Hay alguna razón para intentar volver a sembrar el PRNG cada vez que se crea un nuevo contexto ( SSL_library_init solo se invoca la primera vez)?

  • ¿Es el uso de los contenidos de una variable de pila una forma aceptable de proporcionar aleatoriedad?

La wiki de OpenSSL afirma:

  Inicialización      

OpenSSL intentará inicializar el generador de números aleatorios automáticamente al crear una instancia llamando a RAND_poll . RAND_poll siembra el generador de números aleatorios utilizando una fuente de entropía específica del sistema, que es /dev/urandom en sistemas operativos similares a UNIX, y es una combinación de CryptGenRandom y otras fuentes de entropía en Windows.

     

Tenga cuidado al diferir a RAND_poll en algunos sistemas Unix porque no genera el generador. Consulte el código protegido con OPENSSL_SYS_VXWORKS en rand_unix.c. Además, RAND_poll puede tener interacciones negativas en las plataformas más nuevas de Windows, por lo que su programa podría bloquearse o bloquearse dependiendo del problema potencial. Vea los problemas de Windows a continuación.

PS: Crypt::SSLeay brinda soporte para LWP :: UserAgent de Perl para comunicarse a través de HTTPS. Ya no se usa por defecto , pero se mantiene para no romper configuraciones antiguas.

    
pregunta Sinan Ünür 23.04.2014 - 15:53
fuente

1 respuesta

1

Con las versiones actuales y no tan actuales de OpenSSL, este código es inútil (pero inofensivo), ya que OpenSSL automáticamente se agregará a sí mismo en /dev/urandom en las máquinas donde /dev/urandom está disponible. Esto está documentado :

  

En los sistemas que proporcionan / dev / urandom, el dispositivo de aleatoriedad se utiliza para sembrar el PRNG de forma transparente. Sin embargo, en todos los demás sistemas, la aplicación es responsable de sembrar el PRNG llamando a RAND_add (), RAND_egd () o RAND_load_file ().

En realidad, la documentación es un poco errónea porque en Windows, donde no hay /dev/urandom , OpenSSL usa CryptGenRandom() , por lo que todavía se produce la siembra automática.

En las máquinas donde no hay un PRNG fuerte proporcionado por el sistema, la persona que llama debe proporcionar la entropía "manualmente", pero estos sistemas son, por definición, máquinas donde no hay /dev/urandom .

Los contenidos de una variable de pila sin inicializar no son una buena fuente de entropía, porque tales contenidos suelen ser muy deterministas. Las fuentes razonables de aleatoriedad en una máquina provienen del "mundo físico", típicamente tiempos precisos de eventos de hardware.

    
respondido por el Thomas Pornin 23.04.2014 - 16:02
fuente

Lea otras preguntas en las etiquetas