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/randomor/dev/urandom, then probably you want to use the latter. As a general rule,/dev/urandomshould 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/randominterface is considered a legacy interface, and/dev/urandomis 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/randome/dev/urandomque 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/randomproduza 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.