TL; DR
Use /dev/urandom
para fins mais práticos.
A resposta mais longa depende do sabor do Unix que você está executando.
Linux
Historicamente, /dev/random
e /dev/urandom
foram introduzidos ao mesmo tempo.
Como @DavidSchwartz apontou em um comentário , usar /dev/urandom
é o preferido na grande maioria dos casos . Ele e outros também forneceram um link para o excelente artigo Mitos sobre o /dev/urandom
que eu recomendo para leitura adicional.
Em resumo:
- A página de manual é enganosa
- Ambos são alimentados pelo mesmo CSPRNG para gerar aleatoriedade (diagrams 2 e 3 )
-
/dev/random
bloqueia quando fica sem entropia - A quantidade de entropia é estimada de forma conservadora, mas não é contada
-
/dev/urandom
nunca será bloqueado, a leitura de/dev/random
pode interromper a execução de processos. - Em casos raros, logo após a inicialização, o CSPRNG pode não ter tido entropia suficiente para ser propagado corretamente e
/dev/urandom
pode não produzir aleatoriedade de alta qualidade. - Entropia baixa não é um problema se o CSPRNG foi inicialmente propagado corretamente
- O CSPRNG está sendo constantemente re-propagado
- No Linux 4.8 e superior,
/dev/urandom
não esvazia o pool de entropia (usado por/dev/random
), mas usa a saída CSPRNG do upstream. - Use
/dev/urandom
.
Exceções à regra
Em Quando usar /dev/random
over /dev/urandom
no Linux do Cryptography Stack Exchange
@otus fornece dois casos de uso :
-
Logo após a inicialização em um dispositivo de baixa entropia, se a entropia suficiente ainda não tiver sido gerada para semear adequadamente
/dev/urandom
.
Se estiver preocupado com (1), você pode verificar a entropia disponível em /dev/random
.
Se você está fazendo (2) você já saberá:)
Observação: você pode verificar se a leitura de / dev / random bloqueará , mas tenha cuidado com possíveis condições de corrida .
Alternativa: não use nenhum dos dois!
@otus também apontou que o sistema getrandom()
irá ler a partir de /dev/urandom
e só bloqueia se a entropia inicial da semente não estiver disponível.
Existem problemas com a alteração de /dev/urandom
para usar getrandom()
, mas é concebível que um novo dispositivo /dev/xrandom
é criado com base em getrandom()
.
macOS
Não importa, como A Wikipédia diz :
macOS uses 160-bit Yarrow based on SHA1. There is no difference between /dev/random and /dev/urandom; both behave identically. Apple's iOS also uses Yarrow.
FreeBSD
Não importa, pois a Wikipédia diz :
/dev/urandom
is just a link to/dev/random
and only blocks until properly seeded.
Isso significa que, após a inicialização, o FreeBSD é inteligente o suficiente para esperar até que a entropia de sementes seja reunida antes de entregar um fluxo interminável de bondade aleatória.
NetBSD
Use /dev/urandom
, supondo que seu sistema tenha lido pelo menos uma vez a partir de /dev/random
para garantir uma semeadura inicial adequada.
/dev/urandom
Never blocks.
/dev/random
Sometimes blocks. Will block early at boot if the system's state is known to be predictable.Applications should read from /dev/urandom when they need randomly generated data, e.g. cryptographic keys or seeds for simulations.
Systems should be engineered to judiciously read at least once from /dev/random at boot before running any services that talk to the internet or otherwise require cryptography, in order to avoid generating keys predictably.