Ambos /dev/random
e /dev/urandom
usam um "pool de entropia". Quando o pool acabar, /dev/random
aguarde o reabastecimento, o que requer o monitoramento do comportamento do sistema (entrada do teclado, movimento do mouse etc.), enquanto /dev/urandom
continuará fornecendo dados pseudoaleatórios. /dev/random
teoricamente, é de qualidade superior, mas /dev/urandom
certamente é bom o suficiente para seus propósitos. (Mas /dev/urandom
é provável que seja mais lento do que alguns outros métodos. Um gerador mais rápido, mas de menor qualidade, provavelmente é bom o suficiente para apagar discos rígidos. Não está claro que um invasor tenha alguma vantagem em saber a sequência que será gerada ou que números aleatórios são melhores para esse fim do que uma sequência como 0, 1, 2, 3, 4, ....)
Citando a random(4)
página de manual:
Se você não tiver certeza se deve usar /dev/random
ou
/dev/urandom
, provavelmente deve usar o último. Como regra geral, /dev/urandom
deve ser usado para tudo, exceto para chaves GPG / SSL / SSH de longa duração.
ATUALIZAÇÃO : A página do manual `random (4) foi atualizada desde que escrevi isso. Agora diz:
A /dev/random
interface é considerada uma interface herdada e
/dev/urandom
é preferível e suficiente em todos os casos de uso, com exceção dos aplicativos que exigem aleatoriedade durante o início da inicialização; para esses aplicativos, getrandom(2)
deve ser usado em vez disso, porque ele bloqueará até que o pool de entropia seja inicializado.
Veja também " Mitos sobre / dev / urandom ", de Thomas Hühn.
Mas /dev/urandom
, mesmo que não bloqueie, é provável que seja muito lento se você deseja gerar grandes quantidades de dados. Faça algumas medições no seu sistema antes de tentar.
EDIT: O seguinte é uma digressão em números aleatórios "verdadeiros" vs. números pseudo-aleatórios. Se tudo o que lhe interessa é uma resposta prática à pergunta, você pode parar de ler agora.
Eu pareço reivindicações (incluindo em outras respostas aqui) que /dev/random
implementam um gerador de números aleatórios "verdadeiro", em oposição a um gerador de números pseudo-aleatórios (PRNG). Por exemplo, o artigo da Wikipedia faz tal afirmação. Eu não acredito que isso esteja correto. Há alguma discussão sobre isso aqui, que se refere a geradores de números aleatórios de hardware, mas não vejo evidências de que /dev/random
normalmente use esse dispositivo ou que computadores típicos tenham esse dispositivo. Eles diferem dos PRNGs como a rand()
função C , pois não são determinísticos, pois coletam entropia de fontes que são praticamente imprevisíveis.
Eu diria que existem três classes de geradores de números "aleatórios":
PRNGs determinísticos, como a rand()
função de C , que usam um algoritmo para gerar sequências repetíveis que possuem (mais ou menos) as propriedades estatísticas de uma sequência verdadeiramente aleatória. Eles podem ser bons o suficiente para jogos (dada uma boa maneira de propagá-los) e são necessários para aplicativos que exigem repetibilidade, mas não são adequados para criptografia.
Os geradores gostam /dev/random
e /dev/urandom
coletam entropia de alguma fonte praticamente imprevisível, como a atividade de E / S (é por isso que pressionar o teclado ou mover o mouse pode /dev/random
produzir mais dados). Não está claro (para mim) se eles satisfazem a definição de um PRNG (vi definições que dizem que um PRNG é determinístico), mas também não são verdadeiros geradores de números aleatórios.
Geradores de números aleatórios de hardware que são fisicamente imprevisíveis, mesmo com conhecimento completo de seu estado inicial, e que usam adicionalmente técnicas matemáticas para garantir as propriedades estatísticas corretas.