Para grandes quantidades de dados, você precisa usar /dev/urandom
. O u
é para "ilimitado", o que significa que sempre haverá dados disponíveis. Se você tentar ler muitos dados de /dev/random
, ele será bloqueado, impedindo que seu programa continue por um tempo.
Ambos /dev/random
e /dev/urandom
fornecem dados imprevisíveis (aleatórios). Os dados de /dev/random
devem ser completamente imprevisíveis (ou verdadeiramente aleatórios ), tornando-o adequado para coisas como chaves criptográficas de longo prazo (em que um invasor no futuro pode ter as vantagens de uma extensa pesquisa e computadores muito mais rápidos para tentar quebrar o algoritmo usado para gerar os dados). Os dados de /dev/urandom
são baseados em dados verdadeiramente aleatórios, mas podem ser executados através de uma função pseudo-aleatória alta qualidade para produzir dados adicionais. Ainda é adequado para coisas como chaves de criptografia, desde que você não precise ter certeza de que elas não serão quebradas por décadas, mas também pode ser usado para dados em massa.
O kernel Linux mantém um "pool de entropia" de dados imprevisíveis, em que cada bit tem uma chance igual de ser verdadeiro ou falso (um ou zero). O kernel constrói esse pool de entropia a partir de várias entradas, como origens de hardware, drivers, ações do usuário e qualquer outra coisa que não possa ser prevista com segurança. No entanto, essas fontes demoram para acumular entropia, portanto, o pool de entropia pode ser esgotado se for consumido muito rapidamente.
/dev/random
extrai diretamente do pool de entropia. Quando o pool é esgotado, a leitura de /dev/random
não retorna mais dados até que o pool tenha preenchido o suficiente, o que pode levar algum tempo. /dev/urandom
usa um gerador de números pseudo-aleatório criptograficamente seguro (CSPRNG) semeado a partir do pool de entropia. Pode gerar uma quantidade infinita de saída, mas a saída não pode ser prevista sem conhecer o estado interno do CSPRNG. Como o estado interno é inicialmente baseado em dados verdadeiramente aleatórios, e o algoritmo CSPRNG usado foi projetado para não vazar seu estado interno por meio de sua saída, /dev/urandom
ainda é uma boa fonte de dados altamente aleatórios.
Para recapitular, quando precisar de maximamente dados aleatórios, use /dev/random
. No entanto, se você precisar de muitos dados, precisará usar /dev/urandom
. Em geral, use /dev/urandom
, a menos que você precise que os dados sejam indistinguíveis do ruído verdadeiramente aleatório nas próximas décadas.