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ónOpenSSL 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 deCryptGenRandom
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 conOPENSSL_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.