Pular para conteúdo

Criptografia

Introdução

A criptografia é uma técnica usada para proteger a confidencialidade, integridade e autenticidade de informações. Ela envolve a transformação de dados em um formato ilegível, chamado de texto cifrado, que só pode ser decifrado por uma chave específica. A criptografia é amplamente utilizada em sistemas de segurança de informações, como comunicações seguras, armazenamento de dados confidenciais e autenticação de usuários.

Antigamente

A criptografia tem sido usada ao longo da história para proteger informações confidenciais. Um dos métodos de criptografia mais antigos é a cifra de César, que foi usada pelo imperador romano Júlio César para enviar mensagens secretas a seus generais. A cifra de César é um tipo de cifra de substituição em que cada letra do texto original é substituída por uma letra deslocada um número fixo de posições no alfabeto.

Como funciona a cifra de César:

  • Texto Original: Entre no time de marketing
  • Texto Cifrado: Hqshb qr wlrh gh pdulwlrj

Neste exemplo, o texto original foi deslocado três posições no alfabeto para criar o texto cifrado. Para decifrar a mensagem, basta deslocar as letras três posições no sentido oposto.

Ou seja, shifitamos para o lado 3 vezes

Original Cifrado
A D
B E
C F
D G
E H

etc...

Mas essa técnica é muito simples e facilmente quebrada

Criptografia Moderna

Atualmente, a criptografia moderna é baseada em algoritmos matemáticos complexos que garantem a segurança das informações. Existem dois tipos principais de criptografia:

  • Criptografia Simétrica: Na criptografia simétrica, a mesma chave é usada para criptografar e descriptografar os dados. Isso significa que a chave de criptografia deve ser compartilhada entre o remetente e o destinatário. Exemplos de algoritmos de criptografia simétrica incluem o DES (Data Encryption Standard) e o AES (Advanced Encryption Standard).

  • Criptografia Assimétrica: Na criptografia assimétrica, são usadas duas chaves diferentes: uma chave pública e uma chave privada. A chave pública é usada para criptografar os dados, enquanto a chave privada é usada para descriptografar os dados. Isso permite que qualquer pessoa envie mensagens criptografadas para o destinatário, que pode descriptografá-las usando sua chave privada. Exemplos de algoritmos de criptografia assimétrica incluem o RSA (Rivest-Shamir-Adleman) e o ECC (Elliptic Curve Cryptography).

Mas nosso foco será falar sobre hashes, se quiser saber mais sobre criptografia simétrica e assimétrica, recomendo a leitura do artigo da Wikipedia.

Hashes

Um hash é uma função matemática que transforma um conjunto de dados em uma sequência de caracteres alfanuméricos de comprimento fixo. O hash é usado para verificar a integridade dos dados, garantindo que eles não foram alterados ou corrompidos. Um hash é uma representação única dos dados originais e é usado em várias aplicações, como verificação de arquivos, senhas seguras e autenticação de mensagens.

Um exemplo:

  • Texto Original: Insper
  • Hash MD5: ee40f5397d757da12fac91b6d30c12db

Um pouco da história

O conceito de hash foi introduzido por Hans Peter Luhn em 1953, que propôs o uso de funções hash para indexar e pesquisar registros em bancos de dados. Desde então, os hashes têm sido amplamente utilizados em várias aplicações de segurança e criptografia.

Como antigamente as senhas eram guardadas em texto puro, era fácil para um atacante obter as senhas dos usuários. Para resolver esse problema, as senhas passaram a ser armazenadas como hashes, tornando mais difícil para um atacante obter as senhas originais.

Como um hash funciona?

Bom, um hash é uma função matemática que transforma um conjunto de dados em uma sequência de caracteres alfanuméricos de comprimento fixo. O hash é calculado com base nos dados originais e é único para cada conjunto de dados. Isso significa que, mesmo que os dados originais sejam ligeiramente diferentes, o hash resultante será completamente diferente.

Por exemplo, o Insper e o Insper1 terão hashes completamente diferentes.

Texto Original Hash MD5
Insper ee40f5397d757da12fac91b6d30c12db
Insper1 64dc56a51bec0321b443de1c15c1c812

Mas com o passar dos anos o hash md5 virou um problema, por ter uma quantidade de caracteres pequena muitas pessoas conseguiram criar tabelas de hash e descobrir o texto original, alem disso, pela pequena quantidade de caracteres, muitas vezes se repetiam hashs para diferentes textos.

Novos Hashes

Para resolver esses problemas, foram desenvolvidos novos algoritmos de hash, como o SHA1 (Secure Hash Algorithm 1), SHA256 e SHA512. Esses algoritmos produzem hashes mais longos e mais seguros, tornando mais difícil para um atacante descobrir o texto original a partir do hash.

Um exemplo:

  • Texto Original: Insper
  • Hash SHA256: 8dce2900a8e96750219195b313b96246992c347b588f6181f1206860ac50c42f

Pode-se notar que o hash SHA256 é muito mais longo e mais seguro do que o hash MD5, tornando mais difícil para um atacante descobrir o texto original.

Hoje em dia o SHA256 é muito utilizado para armazenar senhas, mas ainda assim, atacantes ja estão conseguindo quebrar esses hashes, por isso, hoje em dia é usado o SHA512 + Random Salt, que adiciona um valor aleatório ao texto antes de gerar o hash, tornando ainda mais difícil para um atacante descobrir o texto original.

Antes de falar sobre como funciona o Random Salt, vamos falar o porque que ele foi adotado.

Rainbow Tables

Como um hash é um tipo de criptografia de mão única, não é possível descriptografar um hash para obter o texto original. No entanto, os atacantes podem usar tabelas de arco-íris (rainbow tables) para descobrir o texto original a partir de um hash.

Uma tabela de arco-íris é uma tabela de hash pré-computada que mapeia hashes para textos originais. Os atacantes podem usar essas tabelas para procurar um hash específico e encontrar o texto original correspondente. Isso torna mais fácil para um atacante descobrir senhas e outras informações confidenciais.

Palavras do Maraba: "Alguem um dia virou e falou. 'E se eu fizer uma tabela com todos os hashs possiveis?' e assim nasceu as rainbow tables"

Para contornar esse problema, foi introduzido o conceito de Random Salt.

Random Salt

O Random Salt é um valor aleatório que é adicionado ao texto antes de gerar o hash. Esse valor aleatório torna o hash único, mesmo que o texto original seja o mesmo. Isso significa que, mesmo que dois usuários tenham a mesma senha, seus hashes serão diferentes devido ao Random Salt.

Com o Random Salt, os atacantes não podem usar tabelas de arco-íris para descobrir senhas, pois cada hash é único e não pode ser pré-computado. Isso torna impossível para um atacante descobrir senhas a partir de hashes (Por enquanto).