Como o @DavidSchwartz apontou em um comentário , o uso /dev/urandomé preferido na grande maioria dos casos. Ele e outros também forneceram um link para os excelentes mitos sobre o/dev/urandom artigo, que eu recomendo para outras leituras.
Ambos são alimentados pelo mesmo CSPRNG para gerar aleatoriedade ( diagramas 2 e 3 )
/dev/random bloqueia quando fica sem entropia
A quantidade de entropia é estimada de maneira conservadora, mas não contada
/dev/urandomnunca bloqueará, a leitura de /dev/randompode interromper a execução dos processos.
Em casos raros, logo após a inicialização, o CSPRNG pode não ter entropia suficiente para ser propriamente propagado e /dev/urandompode não produzir aleatoriedade de alta qualidade.
Entropia com baixa execução não é um problema se o CSPRNG foi inicialmente propagado corretamente
O CSPRNG está sendo constantemente reinventado
No Linux 4.8 e posteriores, /dev/urandomnão empobrece o conjunto de entropia (usado por /dev/random), mas usa a saída CSPRNG do upstream.
O macOS usa o Yarrow de 160 bits com base no SHA1. Não há diferença entre / dev / random e / dev / urandom; ambos se comportam de forma idêntica. O iOS da Apple também usa o Yarrow.
/dev/urandomé apenas um link /dev/randome bloqueia até propagar corretamente.
Isto significa que, após a inicialização, o FreeBSD é esperto o suficiente para esperar até que a entropia de sementes seja reunida antes de fornecer um fluxo interminável de bens aleatórios.
NetBSD
Use /dev/urandom, supondo que seu sistema tenha lido pelo menos uma vez /dev/randompara garantir a propagação inicial adequada.
/dev/randomÀs vezes bloqueia. Bloqueará cedo na inicialização se o estado do sistema for previsível.
Os aplicativos devem ler de / dev / urandom quando precisarem de dados gerados aleatoriamente, por exemplo, chaves criptográficas ou sementes para simulações.
Os sistemas devem ser projetados para ler criteriosamente pelo menos uma vez em / dev / random na inicialização antes de executar qualquer serviço que fale com a Internet ou que exija criptografia, a fim de evitar a geração de chaves previsivelmente.
BSD: Use/dev/urandom - Exceto que não existe /dev/urandomno OpenBSD. O OpenBSD possui /dev/arandom, mas você não deve usá-lo, você deve usar a arc4random(3)função. Talvez o aconselhamento sobre dispositivos e funções aleatórios deva ser deixado para as pessoas que realmente entendem do que se trata?
Satō Katsura
11
@SatoKatsura Good catch. Atualizado para o FreeBSD para refletir a cotação. Como você proporia determinar quem são essas pessoas?
Tom Hale
3
Qualificações acadêmicas? Trabalho revisado por pares?
Satō Katsura
11
" /dev/randombloqueia quando fica sem entropia" - no Linux, depende de como você abre o dispositivo. Se os opensinalizadores incluírem O_NONBLOCK, ele não será bloqueado. Se não houver entropia, a chamada retornará imediatamente e indicará 0 bytes lidos.
11
@ TomHale O comportamento é IMO menos surpreendente. Se /dev/randomfor apenas (ex :) 60 bytes, ddvocê fornecerá um arquivo de 60 bytes. Usar headno mesmo cenário provavelmente parecerá estar suspenso para sempre. Nem está fazendo o que você quer, mas, pelo menos para mim, é mais óbvio que headnão está fazendo o que era esperado.
Ryan J
5
Tradicionalmente, a única diferença entre /dev/urandome /dev/randomé o que acontece quando o kernel pensa que não há entropia no sistema - /dev/randomfalha fechada, /dev/urandomfalha aberta. Ambos os pilotos foram terceirização de entropia de add_disk_randomness(), add_interrupt_randomness()e add_input_randomness(). Veja /drivers/char/random.cpara detalhes.
Editado para adicionar: A partir do Linux 4.8 /dev/urandomfoi reformulado para usar o CSPRNG.
Então, quando você deve falhar fechado? Para qualquer tipo de uso criptográfico, semeando especificamente DRBG. Há um artigo muito bom explicando as consequências do uso /dev/urandomao gerar chaves RSA e não ter entropia suficiente. Leia Minerando seus Ps e Qs .
Praticamente ninguém usa / dev / random. É essencialmente uma interface obsoleta; as interfaces primárias recomendadas há mais de uma década são / dev / urandom e, agora, getrandom (2).
Testamos regularmente /dev/randome ele sofre falhas frequentes. O teste executa as três etapas: (1) drene /dev/randomsolicitando 10K bytes no modo sem bloqueio; (2) solicita 16 bytes no modo de bloqueio (3) tenta compactar o bloco para ver se é aleatório (teste do homem pobre). O teste leva alguns minutos para ser concluído.
O problema é tão grave nos sistemas Debain (i686, x86_64, ARM e MIPS) que pedimos ao GCC Compile Farm para instalar o rng-toolspacote em suas máquinas de teste. Em Instalar rng-tools no gcc67 e gcc68 :
Gostaria de solicitar que o rng-tools seja instalado no gcc67 e gcc68. Eles são sistemas Debian e / dev / random sofre esgotamento de entropia sem ferramentas de rng ao torturar bibliotecas de teste que utilizam o dispositivo.
Os BSDs e o OS X parecem OK. O problema é definitivamente o Linux.
Também vale a pena mencionar que o Linux não registra falhas no gerador. Eles não queriam que as entradas preenchessem o log do sistema. Até o momento, a maioria das falhas é silenciosa e passa despercebida pela maioria dos usuários.
Especificamente, eu adicionei depends on DEBUG_KERNEL. Isso significa que esses avisos úteis apenas cutucarão outros desenvolvedores de kernel. Provavelmente é exatamente isso que queremos. Se os vários desenvolvedores associados virem um aviso vindo de seu subsistema específico, ficarão mais motivados para corrigi-lo. Usuários comuns em kernels de distribuição não devem ver os avisos ou o spam, pois normalmente os usuários não estão usando DEBUG_KERNEL.
Eu acho que é uma má idéia suprimir todas as mensagens do ponto de vista da engenharia de segurança.
Muitas pessoas não executam kernels de depuração. A maioria dos usuários que desejam ou precisam conhecer os problemas não percebem o que está acontecendo. Considere, a razão pela qual descobrimos os problemas do systemd foi devido ao dmesg.
Suprimir todas as mensagens para todas as configurações gera uma rede maior do que o necessário. As configurações que poderiam ser detectadas e corrigidas provavelmente passarão despercebidas. Se o problema não for trazido à tona, ele não será corrigido.
Eu sinto que o kernel está tomando decisões políticas para algumas organizações. Para aqueles que possuem hardware que é efetivamente impossível de corrigir, a organização precisa decidir o que fazer com base em suas adversidades de risco. Eles podem decidir viver com o risco ou podem atualizar o hardware. No entanto, sem informações sobre o problema, eles podem nem perceber que possuem um item acionável.
O compromisso alcançado posteriormente no encadeamento foi de pelo menos um dmesg por módulo de chamada.
Respostas:
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 ambos introduzidos ao mesmo tempo.Como o @DavidSchwartz apontou em um comentário , o uso
/dev/urandom
é preferido na grande maioria dos casos. Ele e outros também forneceram um link para os excelentes mitos sobre o/dev/urandom
artigo, que eu recomendo para outras leituras.Em suma:
/dev/random
bloqueia quando fica sem entropia/dev/urandom
nunca bloqueará, a leitura de/dev/random
pode interromper a execução dos processos./dev/urandom
pode não produzir aleatoriedade de alta qualidade./dev/urandom
não empobrece o conjunto de entropia (usado por/dev/random
), mas usa a saída CSPRNG do upstream./dev/urandom
.Exceções à regra
No Cryptography Stack Exchange, quando usar
/dev/random
mais/dev/urandom
no Linux @otus, fornece dois casos de uso :Logo após a inicialização em um dispositivo de baixa entropia, se ainda não foi gerada entropia suficiente para propagar adequadamente
/dev/urandom
.Gerando um bloco único com segurança teórica da informação
Se você está preocupado com (1), pode verificar a entropia disponível em
/dev/random
.Se você estiver fazendo (2), você já saberá :)
Nota: Você pode verificar se a leitura de / dev / random irá bloquear , mas cuidado com as possíveis condições de corrida.
Alternativa: use nenhum!
O @otus também apontou que o
getrandom()
sistema lerá/dev/urandom
e bloqueará apenas se a entropia inicial da semente não estiver disponível.Há problemas com a alteração
/dev/urandom
no usogetrandom()
, mas é concebível que um novo/dev/xrandom
dispositivo seja criado com basegetrandom()
.Mac OS
Não importa, como a Wikipedia diz :
FreeBSD
Não importa, como diz a Wikipedia :
Isto significa que, após a inicialização, o FreeBSD é esperto o suficiente para esperar até que a entropia de sementes seja reunida antes de fornecer um fluxo interminável de bens aleatórios.
NetBSD
Use
/dev/urandom
, supondo que seu sistema tenha lido pelo menos uma vez/dev/random
para garantir a propagação inicial adequada.A página de manual rnd (4) diz :
fonte
/dev/urandom
- Exceto que não existe/dev/urandom
no OpenBSD. O OpenBSD possui/dev/arandom
, mas você não deve usá-lo, você deve usar aarc4random(3)
função. Talvez o aconselhamento sobre dispositivos e funções aleatórios deva ser deixado para as pessoas que realmente entendem do que se trata?/dev/random
bloqueia quando fica sem entropia" - no Linux, depende de como você abre o dispositivo. Se osopen
sinalizadores incluíremO_NONBLOCK
, ele não será bloqueado. Se não houver entropia, a chamada retornará imediatamente e indicará 0 bytes lidos./dev/random
for apenas (ex :) 60 bytes,dd
você fornecerá um arquivo de 60 bytes. Usarhead
no mesmo cenário provavelmente parecerá estar suspenso para sempre. Nem está fazendo o que você quer, mas, pelo menos para mim, é mais óbvio quehead
não está fazendo o que era esperado.Tradicionalmente, a única diferença entre
/dev/urandom
e/dev/random
é o que acontece quando o kernel pensa que não há entropia no sistema -/dev/random
falha fechada,/dev/urandom
falha aberta. Ambos os pilotos foram terceirização de entropia deadd_disk_randomness()
,add_interrupt_randomness()
eadd_input_randomness()
. Veja/drivers/char/random.c
para detalhes.Editado para adicionar: A partir do Linux 4.8
/dev/urandom
foi reformulado para usar o CSPRNG.Então, quando você deve falhar fechado? Para qualquer tipo de uso criptográfico, semeando especificamente DRBG. Há um artigo muito bom explicando as consequências do uso
/dev/urandom
ao gerar chaves RSA e não ter entropia suficiente. Leia Minerando seus Ps e Qs .fonte
Essa é uma resposta "eu também", mas reforça a recomendação de Tom Hale. Aplica-se diretamente ao Linux.
/dev/urandom
/dev/random
De acordo com Theodore Ts'o na lista de discussão Linux Kernel Crypto,
/dev/random
está obsoleto por uma década. De Re: [RFC PATCH v12 3/4] Linux Gerador de números aleatórios :Testamos regularmente
/dev/random
e ele sofre falhas frequentes. O teste executa as três etapas: (1) drene/dev/random
solicitando 10K bytes no modo sem bloqueio; (2) solicita 16 bytes no modo de bloqueio (3) tenta compactar o bloco para ver se é aleatório (teste do homem pobre). O teste leva alguns minutos para ser concluído.O problema é tão grave nos sistemas Debain (i686, x86_64, ARM e MIPS) que pedimos ao GCC Compile Farm para instalar o
rng-tools
pacote em suas máquinas de teste. Em Instalar rng-tools no gcc67 e gcc68 :Os BSDs e o OS X parecem OK. O problema é definitivamente o Linux.
Também vale a pena mencionar que o Linux não registra falhas no gerador. Eles não queriam que as entradas preenchessem o log do sistema. Até o momento, a maioria das falhas é silenciosa e passa despercebida pela maioria dos usuários.
A situação deve mudar em breve, pois o kernel imprimirá pelo menos uma mensagem de falha. Do [PATCH] aleatório: silencie os avisos do compilador e corrija a corrida na lista de discussão de criptografia do kernel:
O compromisso alcançado posteriormente no encadeamento foi de pelo menos um dmesg por módulo de chamada.
fonte