Adicionando “entropia de número aleatório” para chaves GPG?

10

No vídeo a seguir: HOWTO Linux: Proteja seus dados com PGP, Parte 2 , você verá como criar um par de chaves gpg. Mais ou menos 1:50, o instrutor diz o seguinte:

Enquanto a chave está sendo gerada, é uma boa idéia mover o mouse um pouco para dar um pouco mais de entropia numérica aleatória para a criação do par de chaves.

Isso me parece um mito, especialmente porque as ferramentas de linha de comando geralmente não devem ser afetadas pelo cursor. Por outro lado, não tenho idéia de como o gerador de números aleatórios do Linux funciona, seja compartilhado pela GUI ou independente dele. Existe alguma ação no que ele afirma, ou isso é um exemplo de programação de culto à carga ?

IQAndreas
fonte
Como questão secundária, esse é o uso correto do "mito urbano" ou existe uma frase semelhante para "mito na computação"?
IQAndreas
1
Eu acho que a frase é lenda urbana ; Eu nunca ouvi falar de mito urbano . Consulte en.wikipedia.org/wiki/Urban_legend Na computação, a frase "cult de carga" pode ser apropriada.
derobert

Respostas:

8

Há um grão de verdade nisso, na verdade mais verdade do que mito, mas, no entanto, a afirmação reflete um mal-entendido fundamental do que está acontecendo. Sim, mover o mouse enquanto gera uma chave com o GPG pode ser uma boa ideia. Sim, mover o mouse contribui com uma entropia que torna aleatórios os números aleatórios. Não, mover o mouse não torna a chave mais segura.

Todos os bons geradores aleatórios adequados para criptografia, e os Linux estão nessa categoria, têm dois componentes:

  • Uma fonte de entropia , que não é determinística. O objetivo da entropia é inicializar o gerador de números aleatórios com dados imprevisíveis. A fonte de entropia deve ser não determinística: caso contrário, um adversário pode reproduzir a mesma computação.
  • Um gerador de números pseudo-aleatórios , que produz números aleatórios imprevisíveis de maneira determinística a partir de um estado interno variável.

A entropia deve vir de uma fonte externa ao computador. O usuário é uma fonte de entropia. O que o usuário faz geralmente não é aleatório, mas o bom momento das teclas e movimentos do mouse é tão imprevisível que pode ser um pouco aleatório - não muito aleatório, mas pouco a pouco, ele se acumula. Outras fontes potenciais de entropia incluem o tempo dos pacotes de rede e o ruído branco da câmera ou do microfone. Versões e configurações diferentes do kernel podem usar um conjunto diferente de fontes. Alguns computadores possuem circuitos RNG de hardware dedicados baseados em decaimento radioativo ou, menos impressionante, em circuitos eletrônicos instáveis. Essas fontes dedicadas são especialmente úteis em dispositivos e servidores incorporados, que podem ter um comportamento bastante previsível em sua primeira inicialização, sem que um usuário faça coisas estranhas.

O Linux fornece números aleatórios para programas através de dois dispositivos: /dev/randome/dev/urandom . A leitura de qualquer dispositivo retorna a qualidade criptográfica. Ambos os dispositivos usam o mesmo estado RNG interno e o mesmo algoritmo para transformar o estado e produzir bytes aleatórios. Eles têm limitações peculiares que tornam nenhum deles a coisa certa:

  • /dev/urandom pode retornar dados previsíveis se o sistema ainda não tiver acumulado entropia suficiente.
  • /dev/randomcalcula a quantidade de entropia disponível e bloqueia se não houver o suficiente. Isso parece bom, exceto que o cálculo é baseado em considerações teóricas que fazem com que a quantidade de entropia disponível diminua linearmente com cada bit de saída. Assim, /dev/randomtende a bloquear muito rapidamente.

Os sistemas Linux salvam o estado RNG interno em disco e o restauram no momento da inicialização. Portanto, a entropia é transferida de uma inicialização para a seguinte. O único momento em que um sistema Linux pode não ter entropia é quando ele é instalado recentemente. Uma vez que existe entropia suficiente no sistema, a entropia não diminui; apenas o cálculo defeituoso do Linux diminui. Para mais explicações sobre essa consideração, leia /dev/urandomé adequado para gerar uma chave criptográfica , por um criptógrafo profissional. Veja também. Você pode explicar a estimativa de entropia usada em random.c .

Mover o mouse adiciona mais entropia ao sistema. Mas o gpg pode apenas ler /dev/random, não/dev/urandom (uma maneira de resolver esse problema é criar /dev/randomo mesmo dispositivo 1: 9 que /dev/urandom), por isso nunca corre o risco de receber números aleatórios que não sejam aleatórios o suficiente. Se você não mover o mouse, a chave é o mais aleatória possível; mas o que pode acontecer é que o gpg pode ser bloqueado em uma leitura de /dev/random, aguardando o contador de entropia do kernel subir.

Gilles 'SO- parar de ser mau'
fonte
Exceto as versões atuais do linux, pelo menos nos meus testes, não usam dispositivos de entrada como fonte de entropia (ou pelo menos da entropia estimada). Tenho certeza de que eles mudaram isso porque, em teoria, eles poderiam estar sob o controle de um atacante.
derobert
@derobert partir de 3,12 há uma chamada para add_input_randomnessnos drivers/input/input.c, mas eu não sei em que circunstâncias ele vai entropia realmente injetar.
Gilles 'SO- stop be evil'
Acho que adiciona entropia, mas com uma estimativa de 0 ... Tentei tanto um mouse USB quanto um teclado PS / 2, nem pareciam aumentar a estimativa de entropia. Não sei por que, no entanto, como vejo a chamada para credit_entropy_bits no código.
21814 derobert
3

O GPG está usando o gerador de números aleatórios do Linux (kernel). O gerador de kernel obtém entropia (aleatoriedade) de todos os tipos de lugares, entre eles o tempo de interrupção, para certas interrupções. Mover o mouse (e digitar, atividade do disco etc.) gerará interrupções.

Assim, mover o mouse de fato potencialmente alimenta o gerador de números aleatórios. Mas se isso depende da versão exata do kernel em uso; as versões mais recentes (pelo menos nos meus testes) não usam interrupções de teclado ou mouse para entropia. A atividade do disco, no entanto, o faz (por exemplo, a execução syncadicionará uma quantidade potencialmente grande de entropia, dependendo da quantidade liberada).

Em resumo: isso não é verdade nas versões atuais do Linux. Foi nos mais velhos.

No entanto, se o gerador ficar sem entropia, ele deverá parar - portanto, sua geração de chaves será interrompida até que alguma entropia seja gerada. Portanto, seria um problema que levaria uma eternidade, não um problema de segurança.

Você pode ver a quantidade de entropia disponível por cat /proc/sys/kernel/random/entropy_avail.

derobert
fonte
Observe também que você pode usar ferramentas como rngdpara alimentar artificialmente o pool de entropia.
Patrick
@ Patrick de fato, e se você tiver um novo chip e confiar na NSA (oh, espere, quero dizer, Intel), poderá usar o RDRAND.
derobert
havegedé outra boa ferramenta para alimentar artificialmente o pool de entropia.
mavillan
Essa não é a história completa - o RNG não fica sem entropia, fica sem sua medida interna de entropia. Além disso, uma parte importante do quebra-cabeça é que o gpg não se importa com o mouse, é o kernel que se importa.
Gilles 'SO- stop be evil'
@ Gilles Esclareci que o gpg está usando o Linux RNG. E os erros no estimador de entropia parecem além do escopo.
derobert
0

O Tails possui uma geração de chaves extremamente rápida porque havegedinstalou:

sudo apt-get install haveged
user123456
fonte