Como verificar se a leitura de / dev / random irá bloquear

6

Encontrei informações de que /proc/sys/kernel//random/entropy_avail indica o número de bits disponíveis em /dev/random . Eu queria verificar se a próxima leitura de /dev/random será bloqueada e minha abordagem ingênua era apenas comparar entropy_avail e número de bits aleatórios necessários, mas isso não funciona bem. Quando fiz uma experiência estúpida simples, percebi que a entropia está em buffer. O buffer de entropia de 64 bits fornece 6 bytes de dados aleatórios.

Eu monitorei o entropy_avail por meio desse comando simples:

while true
do
    cat /proc/sys/kernel//random/entropy_avail
    sleep 1
done

E eu estava tentando obter um byte aleatório via comando

dd if=/dev/random bs=1 count=1 > /dev/null

O comando dd é bloqueado se a entropia for 63 ou inferior. Quando a entropia atinge 64 e eu leio um byte, então a entropia diminui para 0, mas eu posso ler outros 5 bytes sem bloquear. Então dd bloqueia novamente até a entropia atingir 64.

Qual é o significado exato do entropy_avail e como posso detectar o número real de bits aleatórios disponíveis?

    
por Zaboj Campula 15.11.2015 / 11:37

1 resposta

8

entropy_avail não indica o número de bits disponíveis em /dev/random . Indica a estimativa de entropia do kernel no estado RNG que energiza /dev/random . Essa estimativa de entropia é uma quantidade bastante sem sentido, matematicamente falando; mas o Linux bloqueia /dev/random se a estimativa de entropia for muito baixa.

Um programa lendo /dev/random bloqueia até que o valor em /proc/sys/kernel/random/entropy_avail seja maior que /proc/sys/kernel/random/read_wakeup_threshold . A leitura de /dev/random consome entropia à taxa de 8 bits por byte.

Mas, de qualquer forma, você não deveria estar usando /dev/random . Você deve estar usando /dev/urandom , que é tão seguro, inclusive para gerar chaves criptográficas , e que não bloqueia. Gerar números aleatórios não consome entropia: uma vez que o sistema tenha entropia suficiente, é bom para a vida do universo. O sistema operacional salva uma semente de RNG em um arquivo, portanto, uma vez que o sistema tenha entropia suficiente, ele terá entropia suficiente, mesmo após a reinicialização.

Os únicos casos em que /dev/urandom não é seguro estão em um sistema recém-instalado inicializando pela primeira vez, em um sistema ativo que acabou de ser inicializado (então, gerar chaves criptográficas de um sistema ativo não é uma boa idéia!) ou em um dispositivo incorporado recém-inicializado que não tenha um RNG de hardware ou memória persistente. Em tais sistemas, aguarde até que /dev/random concorde em liberar 16 bytes para garantir que o pool de entropia esteja configurado. Então use /dev/urandom .

    
por 15.11.2015 / 23:45

Tags