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/randombloqueia quando fica sem entropia - A quantidade de entropia é estimada de forma conservadora, mas não é contada
-
/dev/urandomnunca será bloqueado, a leitura de/dev/randompode 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/urandompode 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/urandomnã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/urandomis just a link to/dev/randomand 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/urandomNever blocks.
/dev/randomSometimes 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.