Imagine um cara de moletom com capuz, sentado diante de um computador com várias telas. Nelas há um monte de letras verdes sobre fundo preto e talvez algumas barras de progresso mostrando uma porcentagem. Esse é o típico hacker de filme, um gênio da informática. Não importa se o alvo dele é um espião inimigo ou o governo; com a experiência que tem e a sequência certa de teclas, mais cedo ou mais tarde ele vai conseguir acessar o computador do adversário e comprometê-lo. Mas até que ponto isso é verdade? Será que sempre vai existir um ponto em que alguém consegue hackear alguma coisa?
Se imaginarmos uma porta de madeira numa casa, sabemos que ela impede a passagem da maioria das pessoas; mas alguém poderia abrir a fechadura com uma gazua ou, quem sabe, alguém mais desesperado poderia usar um machado ou um aríete e entrar à força. Troque por uma porta de metal e talvez você consiga arrombá-la com um maçarico, uma esmerilhadeira ou algum explosivo. Cada vez que você reforça a segurança da porta, dá para encontrar um método de ataque mais potente para vencê-la. Isso acontece mesmo com a cibersegurança? Por mais que os algoritmos avancem, sempre vai haver algum jeito de vencê-los?
No mundo digital, não dá para fazer bits mais duros nem programas que precisem de pancadas mais fortes no teclado para serem quebrados; o que temos para nos proteger é a matemática, problemas tão difíceis que nem os computadores mais potentes de hoje conseguiriam resolver.
Ao longo da história, os algoritmos foram mudando. Os primeiros computadores eram tão lentos que não davam conta do uso legítimo se não usassem um algoritmo leve, e com o tempo esses algoritmos foram sendo quebrados. Alguns simplesmente porque os computadores ficaram tão poderosos que conseguiam quebrá-los rápido; outros porque encontraram vulnerabilidades neles, atalhos matemáticos que permitiam burlar o algoritmo.
Mas hoje temos algoritmos que, até onde se sabe, nem os computadores atuais nem os do futuro conseguiriam quebrar, incluindo os quânticos. Chegamos a um ponto em que a matemática é tão sólida que o que compensa para o atacante já não é procurar um jeito de quebrar os algoritmos, e sim de contorná-los. Temos algoritmos praticamente impossíveis de quebrar, a ponto de a maior vulnerabilidade ser o erro humano, como deixar a porta destrancada ou até deixar um buraco onde deveria haver uma porta.
Quando eu estava no ensino médio, na época de ouro dos cyber[1], muita gente tinha a conta invadida. Muitos achavam que era uma vulnerabilidade inerente à internet: com conhecimento e recursos suficientes, tinha que existir um jeito de roubar qualquer conta.
Eu sabia que havia três explicações possíveis:
-
A pessoa marcou “lembrar minha senha” no computador do cyber. Quem usou aquele computador depois entrou sem dificuldade.
-
A senha era tão fácil que alguém conhecido adivinhou. Era a data de nascimento ou o nome do cachorro.
-
Aquele computador tinha um keylogger: um aplicativo que registrava todas as teclas pressionadas. Isso acontecia com mais frequência do que você imagina.
Das três, a primeira era a mais provável. Mas, nas três situações, o ponto fraco foi a pessoa ou o computador que ela usou. O servidor nem ficou sabendo. E, num serviço bem feito, mesmo que alguém tivesse entrado no servidor, a senha nem deveria estar lá.
Algoritmos de mão única
Quando você cria uma conta num site bem feito, o site não guarda sua senha. Guarda um número calculado a partir dela com uma função hash.
Vamos inventar uma bem simples. Cada letra recebe sua posição no alfabeto: a = 1, b = 2, c = 3, até z = 26. O hash de uma palavra é a soma das letras. Vou manter as palavras em espanhol nestes exemplos para não mudar as contas.
hola → 8 + 15 + 12 + 1 = 36
Troque uma letra para formar hora: agora dá 42. Um número diferente, que à primeira vista não parece seguir um padrão. Mas segue.
Agora vem a parte importante. Se eu disser “o número é 36”, você consegue dizer qual era a palavra? Matematicamente, não. A soma perde informação: você já não sabe quais eram as letras nem em que ordem estavam.
Esses algoritmos de mão única são chamados de “funções hash”. Os servidores usam essas funções para armazenar senhas, ou pelo menos deveriam usar. Se alguém roubar o banco de dados, vai ver 36, mas não vai saber sua senha. Teria que tentar palavras até alguma produzir 36.
Com a nossa função simples, isso é bem fácil. Experimente palavras comuns como hola e vida: as duas dão 36, então qualquer uma serviria para entrar na conta. Quando duas entradas diferentes produzem o mesmo resultado, isso se chama colisão. Nosso algoritmo tem um monte delas: amor, roma, ramo, mora e pez dão 47. Se sua senha for amor, alguém poderia entrar com pez, porque o resultado é igual.
Para evitar isso, usam algoritmos como o SHA-256, que seguem a mesma ideia, mas são muito mais complexos. Em vez de somar letras, misturam os bits da entrada em 64 rodadas de operações e produzem um número de 256 bits. Este é o hash de hola:
b221d9dbb083a7f33428d7c2a3c3198ae925614d70210e28716ccaa7cd4ddb79
E este é o de Hola, com H maiúsculo:
e633f4fc79badea1dc5db970cf397c8248bac47cc3acf9915ba60b5d76b0e88f
Você muda uma letra e recebe um resultado completamente diferente, sem um padrão visível. No SHA-256, as colisões existem em teoria: há infinitas palavras possíveis e um número finito de resultados. Mas ninguém encontrou uma. Também não existe um jeito conhecido de pegar um hash e fabricar uma palavra que o produza. Hoje, o armazenamento de senhas usa algoritmos ainda mais complexos, como Argon2 e bcrypt. Eles são mais lentos de calcular de propósito e acrescentam partes aleatórias para dificultar o acerto por força bruta.
Então como o site sabe que você digitou a senha certa se ele não a tem guardada? Calcula o hash do que você digitou e compara com o que salvou. Se os dois coincidem, é você.
O próprio site não guarda sua senha. Se um funcionário abrir o banco de dados, vai ver números. Se alguém roubar esse banco, também. Se o diretor da empresa, ou um governo com uma ordem judicial, exigir sua senha, não têm como entregá-la. Não é uma recusa. A senha não existe em lugar nenhum, só o resultado do hash. Um serviço bem feito nunca diz qual era sua senha. Se você esquecer, vai ter que criar outra, porque nem eles sabem qual era a anterior.
Infelizmente, nem todo mundo faz isso. Uma vez, usei o procedimento de recuperação de senha da Telcel, uma operadora de celular do México. Me mandaram minha senha, exatamente como era, em texto puro. O mais assustador? Foi há poucos anos.
Só que tentar combinações diferentes até acertar continua funcionando. Se sua senha for simples demais, um atacante pode adivinhá-la bem rápido. Por isso o tamanho da senha importa tanto. Vamos falar disso em outro post.
Acesso e criptografia
Impedir que alguém recupere sua senha é uma boa proteção, mas a senha é só uma verificação. Um erro no código pode passar por cima dela. É aí que entra a criptografia.
Criptografar é transformar uma mensagem em algo ilegível que só pode ser decifrado com uma chave. Diferentemente do hash, aqui dá para voltar à mensagem original, mas só se você tiver a chave.
Vamos ver outro algoritmo simples, tão antigo quanto Júlio César. A chave é um número, e criptografar é deslocar cada letra esse número de posições no alfabeto. Com a chave 3, hola vira krod: h vira k, o vira r, l vira o e a vira d. Para voltar, você desloca as letras 3 posições para trás. Sem a chave, krod não diz muita coisa.

É seguro? Nem um pouco. Só existem 25 chaves possíveis. Quem vê krod e não sabe a chave pode testar todas. Só uma produz algo legível: com 1, sai jqnc; com 2, ipmb; com 3, hola. Mais cedo ou mais tarde, a pessoa descobriria a chave por tentativa e erro.
Então vamos complicar. Em vez de usar um único número para tudo, usamos um diferente para cada letra: por exemplo, 7, 2, 19 e 11. Agora hola vira oqel. O atacante precisa testar 26^4 chaves em vez de 25, quase 457.000 combinações. Bem mais seguro que o anterior. Mesmo assim, pode aparecer um padrão reconhecível que facilite descobrir a chave. Um computador resolve isso em muito pouco tempo.
As cifras seguras aumentam a complexidade do algoritmo até ficar muito difícil adivinhar a chave por tentativa e erro. O AES não desloca letras. Trabalha com blocos de 128 bits, misturando-os em 14 rodadas de operações com uma chave de 256 bits. Isso é tão complexo que não aparece um padrão fácil de explorar; só resta testar chave por chave. É o que protege suas mensagens, suas fotos na nuvem e a conexão com seu banco. Então, mesmo que alguém entre numa conta pela porta errada, se os dados estiverem bem criptografados e a pessoa não tiver a chave, só vai encontrar ruído.
Quantas chaves existem? Nosso primeiro brinquedo tinha 25. O segundo tinha 26^4. No AES-256, uma chave pode ter 2^256 valores diferentes. Escrito por inteiro, esse número tem 78 dígitos.
Imagine um computador capaz de testar um quintilhão de chaves por segundo: um 1 seguido de 18 zeros. Isso já é mais do que qualquer supercomputador atual conseguiria. Testar todas levaria cerca de 3,7 × 10^51 anos. O universo tem aproximadamente 13,8 bilhões de anos, então você teria que esperar a idade inteira dele mais de 10^41 vezes.
Com a tecnologia atual, ninguém consegue quebrar a criptografia AES-256, nem usando todos os computadores do planeta. Se você vir num filme um hacker quebrando a criptografia avançada de um espião inimigo depois de digitar por alguns minutos, já sabe: é tão fantasioso quanto abrir um cadeado apontando uma varinha e dizendo “Alohomora”.
Mas o futuro não está completamente garantido. Computadores quânticos poderiam resolver alguns problemas muito específicos mais depressa. Para alguns algoritmos atuais, a complexidade matemática fica trivial.
Até onde se sabe publicamente, ainda não existem computadores quânticos grandes o suficiente. Mas já temos uma resposta para quando existirem. Em 2024, o NIST publicou os primeiros padrões de criptografia projetada para resistir a computadores quânticos. Alguns navegadores e aplicativos de mensagens já os usam. Ainda falta chegar a tudo, mas não estamos esperando de braços cruzados. Como funciona um computador quântico e como nos protegemos dele fica para outro post.
No próximo, vamos tratar de algo que está nas suas mãos: suas senhas, e por que uma frase longa protege você mais do que uma senha complicada como P@ssw0rd!.
Referências
- NIST. FIPS 180-4: Secure Hash Standard (SHS). https://csrc.nist.gov/pubs/fips/180-4/upd1/final
- NIST. FIPS 197: Advanced Encryption Standard (AES). https://csrc.nist.gov/pubs/fips/197/final
- Biryukov, Dinu, Khovratovich e Josefsson. RFC 9106: Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications (2021). https://www.rfc-editor.org/info/rfc9106
- Provos e Mazières. “A Future-Adaptable Password Scheme” (bcrypt). USENIX Annual Technical Conference, 1999. https://www.usenix.org/conference/1999-usenix-annual-technical-conference/future-adaptable-password-scheme
- Planck Collaboration. “Planck 2018 results. VI. Cosmological parameters”. Astronomy & Astrophysics 641, A6 (2020). https://arxiv.org/abs/1807.06209
- Shor, P. W. “Polynomial-Time Algorithms for Prime Factorization and Discrete Logarithms on a Quantum Computer”. SIAM Journal on Computing 26(5), 1997. https://arxiv.org/abs/quant-ph/9508027
- NIST. “NIST Releases First 3 Finalized Post-Quantum Encryption Standards” (13 de agosto de 2024). https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards
- Chromium Blog. “Advancing Our Amazing Bet on Asymmetric Cryptography” (Chrome 124). https://blog.google/chromium/advancing-our-amazing-bet-on-asymmetric/
- Apple Security Research. “iMessage with PQ3: The new state of the art in quantum-secure messaging at scale” (2024). https://security.apple.com/blog/imessage-pq3/
- Kret e Schmidt. “The PQXDH Key Agreement Protocol”, Signal (rev. 3, 2023). https://signal.org/docs/specifications/pqxdh/
No México, “el cyber” é um lugar onde você aluga computadores com internet por hora. Às vezes era um cibercafé, mas muitas vezes era a papelaria da esquina com alguns computadores nos fundos. ↩︎

