Lâmpadas de Lava: A Entropia na Segurança Digital

Ítalo Assunção
Geekie Educação
Published in
6 min readNov 21, 2023
Uma lâmpada de lava amarela

Bateu a curiosidade para saber como esse icônico item decorativo pode ter algo a ver com segurança digital? Está com dúvidas sobre o que é entropia? Viveu os anos 70 e sentiu uma nostalgia? Então fica aqui que vamos falar um pouquinho de tudo isso!

Para começar… o quê é uma Lâmpada de Lava?

Bom, talvez você seja jovem demais para conhecer, mas ela é uma espécie de abajur com dois líquidos que não se misturam dentro, normalmente água para a base e parafina (ou algum tipo de cera) para as bolas. Essas lâmpadas funcionam iluminando a câmara de vidro (afinal, sem luz não é uma lâmpada 😅) e aquecendo sua base ligeiramente. Como a densidade dos componentes não é muito diferente, o calor causa expansão nas bolas de cera e as faz perder um pouco de densidade, provocando uma subida vagarosa. Chegando no topo, elas se resfriam, aumentando a densidade novamente, e voltam para o fundo. É, assim, gerada uma movimentação super característica que dá todo o charme dessa engenhoca.

Entendi! E o que um abajur engraçado tem a ver com segurança digital?

Bom, antes de explicar isso, precisamos entender um pouco mais sobre alguns conceitos básicos de segurança digital.

Por conceitos básicos, me refiro especialmente à qualquer parte da segurança digital que necessite de números verdadeiramente aleatórios, como por exemplo:

  • Geração de chaves criptográficas, como as chaves de uma conexão por SSH;
  • Assinaturas digitais com chave privada;
  • Criptografias baseadas em chaves pública e privada, como os exemplos mais populares: RSA, AES, ECC;
  • Códigos aleatórios de autenticação, como o Google Auth, métodos de login sem senha, envios de código de confirmação de conta e reset de senha;
  • Números de cartões de crédito;
  • Criptografia de dados em repouso, que consiste em criptografar dados armazenados num disco ou em uma mídia de backup.

Pouco importante, né? 😬

Mas não entre em pânico! Essas funcionalidades estão bastante seguras, pois usam geradores de números verdadeiramente aleatórios, chamados de RNG (Random Number Generators, se você pensou na outra sigla você com certeza tem um bom número de jogos RPG jogados 🎲).

Como assim números verdadeiramente aleatórios? 🤔

Surpresa! Os números que geramos com as conhecidas funções Math.random() do JavaScript, randint() do Python ou essencialmente qualquer uma nativa ou de biblioteca não especializada na geração de números verdadeiramente aleatórios não são aleatórios! 🤯

E se você parar para pensar… faz total sentido! Tente imaginar uma maneira completamente matemática, uma fórmula onde sem input algum, você consiga diferentes outputs toda vez que a executar. Não existe! Isso porque a matemática é determinística, o que significa que todas as suas regras e princípios são baseados em relações precisas e previsíveis, sendo incapaz de gerar vários resultados diferentes para um mesmo cálculo.

Esses algoritmos muito rasos de geração de números aleatórios são chamados de PRNG (Pseudo-Random Number Generators). São funções matemáticas que recebem algum tipo de input, comumente chamado de seed, e com base nesse input fazem vários cálculos em cima (principalmente manipulação de bits), para gerar outros números. Qual o problema disso? Uma mesma seed vai gerar exatamente os mesmos números, na mesma ordem, sempre que for executada novamente com seu estado inicial.

De cara já dá pra ver um problemão nisso. Imagine que os casos que citei lá em cima fossem PRNGs: se de alguma forma uma pessoa mal intencionada descobrisse a seed original do gerador de números de cartões de crédito, ela teria acesso a todos os cartões que aquele banco geraria! 😱

Um caso bastante comum de falta de segurança nesses números aleatórios mais "fracos" é o sistema de PRNG de jogos, como o Pokemon. Alguns jogos da franquia, principalmente o Pokemon Diamond e Pearl, geram os números com uma seed baseada na hora exata em que o console (Nintendo DS) foi ligado depois de uma descarga total na bateria. Isso significa que, se você conseguir reproduzir exatamente essa condição e ligar o Nintendo DS na hora exata, você vai ter os mesmos Pokemons gerados, em ordem, que outra pessoa pode ter tido em outro console. Isso é muito usado como cheat para tentar capturar Pokemons mais raros (shiny), e, é claro, já existem programas para fazer isso automaticamente numa hora específica.

Essa técnica do jogo Pokemon traz uma camada de segurança extra, gerando a seed a partir de um dado pouco previsível (se usado de maneira normal), embora ainda claramente manipulável e inseguro.

Uma das técnicas para deixar um PRNG mais próximos do verdadeiro RNG é o uso de um input externo de um dado realmente aleatório para a seed. É o que chamamos de extração da ENTROPIA.

O que é, onde encontro e como extraio entropia?

Entropia é o conceito que se refere à natureza caótica, desordenada e aleatória de um sistema. Onde você pode encontrá-la? Oras… em tudo! É a natureza do Universo inteiro. Pense bem! A chuva não cai num padrão exato, ondas de som não viajam exatamente na mesma velocidade, a temperatura não varia sempre do mesmo jeito… tudo nesse colossal universo é regado de verdadeiro e completamente aleatório CAOS.

Sabendo disso, os pontos começam a se ligar…

O jogo do Pokemon usa uma seed que não é entrópica: a hora em que o console foi ligado. Caso você não saiba, o próprio conceito de tempo, na verdade, não existe e foi criado por seres humanos apenas para conseguirem se organizar com algumas coisas. Então, de aleatório não tem nada. Ajuda naquele caso porque, pelo menos, dá um trabalho extra para quem for tentar burlar o sistema, além de ser uma forma de gerar números diferentes em momentos diferentes.

Voltando a falar um pouco sobre as funções básicas: no Math.random(), a definição da implementação fica a critério do próprio navegador, bastando apenas seguir as diretrizes do ECMAScript:

Returns a Number value with positive sign, greater than or equal to 0 but less than 1, chosen randomly or pseudo randomly with approximately uniform distribution over that range, using an implementation-dependent algorithm or strategy. This function takes no arguments.

Tradução não oficial:

Retorna um valor Number positivo, maior ou igual a 0 porém menor do que 1, escolhido de maneira aleatória ou pseudo aleatória com distribuição uniforme aproximada sobre o intervalo, usando um algoritmo dependente de implementação ou estratégia. Essa função não recebe argumentos.

A titulo de curiosidade, a maioria dessas implementações, não apenas do JavaScript, mas de grande parte dessas funções básicas, utiliza capturas de ruído atmosférico com microfones quando possível, ou variações de temperatura do processador da máquina detectadas com sensores de calor, adicionalmente rodando algum algoritmo de geração de números em cima que já são medidas bem mais seguras que o simples horário, mas ainda podem ser simuladas, mesmo que com muito mais dificuldade.

Hoje, o algoritmo mais usado nos navegadores é o xorshift128. Uma simples implementação dele se parece com isso:

class XORShift128 {
constructor(seed1, seed2) {
this.s0 = seed1;
this.s1 = seed2;
}

// Gera um número aleatório de 32 bits.
random() {
let x = this.s0;
const y = this.s1;
this.s0 = y;
x ^= (x << 23) & 0xFFFFFFFF;
x ^= (x >>> 17) & 0xFFFFFFFF;
x ^= (x << 26) & 0xFFFFFFFF;
this.s1 = x;
return (x + y) & 0xFFFFFFFF;
}
}

Então a lâmpada de lava serve como fonte de entropia para geração de números aleatórios?

Exatamente, padawan! Uma das mais criativas e seguras dentre as milhares formas de extrair entropia é com uso da dinâmica de fluidos das lâmpadas de lava!

A empresa que provavelmente mais contribuiu para disseminação desse conhecimento foi a CloudFlare, uma das maiores empresas de segurança na Internet do mundo, que em sua sede possui uma enorme parede cheia de lâmpadas de lava e uma câmera apontada para ela, que tira várias fotos periodicamente. Essas fotos então são convertidas de uma stream de bytes para um número e voilá! Temos uma seed verdadeiramente aleatória e extremamente difícil de reproduzir, dado que cada lâmpada por si só já é imprevisível e vai gerar uma parte aleatória desse valor geral.

Uma foto de uma parede cheia de lâmpadas de lava no escritório matriz da CloudFlare
Fonte: Dani Grant

Conclusão

Com isso, espero que tenha dado para entender e aprender um pouco mais sobre segurança digital, números aleatórios, a capacidade de gerá-los digitalmente e lâmpadas de lava.

Sinta-se livre para deixar qualquer dúvida, comentário ou sugestão aí embaixo! 😄

Deixe um comentário falando sobre as lâmpadas de lava. Você já conhecia? Acha legal? Bateu uma vontade de comprar uma?

Até a próxima!

--

--

Ítalo Assunção
Geekie Educação

Brazilian Software Engineer @ Geekie. Basketball nerd and tech lover 💜