Devo usar /dev/random
ou /dev/urandom
?
Em quais situações eu preferiria um ao outro?
Devo usar /dev/random
ou /dev/urandom
?
Em quais situações eu preferiria um ao outro?
Respostas:
Use /dev/urandom
para fins mais práticos.
A resposta mais longa depende do sabor do Unix que você está executando.
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
.
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 base getrandom()
.
Não importa, como a Wikipedia diz :
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.
Não importa, como diz a Wikipedia :
/dev/urandom
é apenas um link/dev/random
e 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.
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 :
/dev/urandom
Nunca bloqueia.
/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.
/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 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?
/dev/random
bloqueia quando fica sem entropia" - no Linux, depende de como você abre o dispositivo. Se os open
sinalizadores incluírem O_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. Usar head
no mesmo cenário provavelmente parecerá estar suspenso para sempre. Nem está fazendo o que você quer, mas, pelo menos para mim, é mais óbvio que head
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 de add_disk_randomness()
, add_interrupt_randomness()
e add_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 .
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 :
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/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 :
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.
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:
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.