Tanto /dev/random
quanto /dev/urandom
usam um "pool de entropia". Quando o pool se esgotar, /dev/random
aguardará o reabastecimento, o que requer monitoramento do comportamento do sistema (entrada do teclado, movimentação do mouse, etc.), enquanto /dev/urandom
continuará fornecendo dados pseudo-aleatórios. /dev/random
é teoricamente maior qualidade, mas /dev/urandom
é quase certamente bom o suficiente para seus propósitos. (Mas mesmo /dev/urandom
é provavelmente mais lento do que alguns outros métodos. Um gerador mais rápido, mas de qualidade inferior, provavelmente é bom o suficiente para apagar discos rígidos. Não está claro se um atacante ganharia alguma vantagem ao saber a sequência que será gerado, ou que números aleatórios são melhores para este propósito do que uma sequência como 0, 1, 2, 3, 4, ....)
Citando a página random(4)
man:
If you are unsure about whether you should use
/dev/random
or/dev/urandom
, then probably you want to use the latter. As a general rule,/dev/urandom
should be used for everything except long-lived GPG/SSL/SSH keys.
UPDATE : A página man 'random (4) foi atualizada desde que escrevi isso. Agora diz:
The
/dev/random
interface is considered a legacy interface, and/dev/urandom
is preferred and sufficient in all use cases, with the exception of applications which require randomness during early boot time; for these applications,getrandom(2)
must be used instead, because it will block until the entropy pool is initialized.
Veja também " Mitos sobre / dev / urandom " de Thomas Hühn.
Mas /dev/urandom
, mesmo que não seja bloqueado, provavelmente será muito lento se você quiser gerar grandes quantidades de dados. Faça algumas medições no seu sistema antes de tentar.
EDITAR: O que se segue é uma digressão sobre números aleatórios "verdadeiros" vs. números pseudo-aleatórios. Se tudo o que você tem interesse é uma resposta prática para a pergunta, pare de ler agora.
Parece que existem afirmações (inclusive em outras respostas aqui) que /dev/random
implementa 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 essa afirmação. Eu não acredito que 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 nenhuma evidência de que /dev/random
normalmente use um dispositivo desse tipo ou que computadores comuns tenham esse dispositivo. Eles diferem dos PRNGs como a função C rand()
, pois não são determinísticos, pois capturam a entropia de fontes praticamente imprevisíveis.
Eu diria que existem três classes de geradores de números "aleatórios":
-
PRNGs determinísticos, como a função
rand()
do C, que usa 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 (com uma boa maneira de propagá-los) e são necessários para aplicativos que exigem repetibilidade, mas não são adequados para criptografia. -
Geradores como
/dev/random
e/dev/urandom
que coletam entropia de alguma fonte praticamente imprevisível como atividade de E / S (é por isso que bater no teclado ou mover o mouse pode fazer com que/dev/random
produza mais dados) . Não está claro (para mim) se estes satisfazem a definição de um PRNG (eu vi definições que dizem que um PRNG é determinístico), mas também não são verdade geradores de números aleatórios. -
Geradores de números aleatórios de hardware que são fisicamente imprevisíveis, mesmo com o conhecimento completo de seu estado inicial, e que adicionalmente usar técnicas matemáticas para garantir as propriedades estatísticas certas.