Como a coleta de lixo não é determinística, por que não é usada para geração segura de números aleatórios?

13

Entendo que / dev / random é uma boa fonte de entropia, e é o que geralmente é usado - é como estou lendo no GC, pelo menos em Java, parece aceito que o daemon de coleta de lixo é executado de forma não determinística . Se isso é verdade, por que não usamos o tempo da coleta de lixo como fonte de entropia em vez da variável / dev / random?

edthethird
fonte
7
veja alguns dos documentos para as funções rand () na biblioteca C padrão. Eles destacam especificamente que, embora ofereçam o que parece números aleatórios, eles não podem ser usados ​​por segurança. Seu coletor de lixo típico provavelmente se enquadra na mesma categoria. Se você for usar um por segurança, certifique-se de usar um coletor de lixo criptograficamente seguro.
DXM
15
algo nondeterministic ainda pode ser altamente previsível
catraca aberração
7
Nesse caso, "não determinístico" é uma descrição ruim. Um coletor de lixo é um sistema completamente determinístico e, se você tiver conhecimento completo de seu estado e do estado do programa que o utiliza, poderá prever deterministicamente os resultados.
Gort the Robot
4
@DXM você conhece uma boa implementação para um coletor de lixo criptograficamente seguro? ;)
AJMansfield
7
"Qualquer um que considere métodos aritméticos de produzir dígitos aleatórios está, é claro, em estado de pecado". - John von Neumann
Mark Adler

Respostas:

58

"Não especificado" e "aleatório" são dois conceitos completamente diferentes.

O funcionamento exato de um coletor de lixo não é especificado e depende do coletor de lixo (geralmente implementado por uma VM das sortes, mas não necessariamente).

Portanto, você não tem um tempo especificado (isto é, determinístico) no qual o lixo será coletado.

No entanto, qualquer implementação dada seguirá algumas regras e há uma grande chance de que duas execuções subseqüentes do mesmo programa tenham padrões de coleta de lixo muito semelhantes.

Portanto, a entropia real fornecida por um coletor de lixo seria muito baixa (e descobrir quais partes você pode realmente usar como entropia será complicado).

Como comparação: A HashMapem Java não garante nenhuma ordem de recuperação para seus membros (basicamente porque garantir isso acrescentaria uma sobrecarga que não vale a pena pagar, na maioria das vezes). No entanto, para uma determinada implementação e um determinado conjunto de inserções / remoções, você pode definitivamente calcular o pedido resultante. Só porque não há garantia para um determinado pedido, não significa que o pedido seja aleatório.

Joachim Sauer
fonte
20
Eu acho que seria uma afirmação justa dizer que, se um computador faz algo que é realmente não determinístico, esse computador está quebrado.
Schilcote
Não determinístico também pode significar que depende de algum estado externo ao programa em questão, o qual pode ser determinístico, mas será completamente não relacionado ao programa em si e pode ser diferente sempre que o programa for executado.
asmeurer
@asmeurer Acho que não ouvi esses termos em nenhum contexto. Na verdade, eu nem tenho certeza do que você quer dizer: todo programa que recebe entrada externa (ou seja, programas mais úteis) "depende de algum estado externo", mas isso não a torna não determinística.
us2012
2
@ Schilcote: Algumas CPUs modernas têm RNGs não determinísticos (verdadeiros) implementados em hardware. Estes são verdadeiramente não determinísticos até a física de nível quântico.
MSalters
2
@ Schilcote Mesmo sem instruções especializadas da RNG (RDRAND e RDSEED da Intel), um computador não é completamente determinístico. Alguns horários não são completamente especificados e podem depender de fatores externos, como temperatura.
CodesInChaos
8

Primeiro, temos que ter cuidado para não cair na armadilha do raciocínio, manipulando meras palavras. Por exemplo, poderíamos perguntar, uma vez que uma NFA é um "autômato finito não determinístico", por que não a usamos para obter números aleatórios? Nesse caso, seria porque não é isso que "não determinístico" significa em uma NFA; de fato, quando simulamos um NFA, em uma determinada entrada, o comportamento da simulação é perfeitamente determinístico.

"Determinístico" é uma frase carregada. Para um programador ou cientista da computação, o comportamento não determinístico significa apenas "determinar o comportamento exato que é complicado de se pensar" e depende de muitos fatores, incluindo a entrada do programa.

No entanto, isso não significa que não seja determinístico para alguém motivado a atacar um sistema de criptografia. Às vezes, fatores e entradas ambientais podem ser identificados, e padrões repetíveis emergem do comportamento "não determinístico".

Kaz
fonte