Hashes
Hashes são valores gerados a partir de uma função hash (um algorítmo), que transforma uma entrada (como um texto ou arquivo) em uma string em formato hexadecimalde de comprimento fixo. Essas strings, chamadas de "valores hash" ou simplesmente "hashes", são únicas para cada entrada, o que significa que mesmo uma pequena alteração na entrada original resulta em um hash completamente diferente.

Propriedades Importantes de Hashes:
- Determinismo: A mesma entrada sempre gera o mesmo hash.
- Rapidez: Funções hash são rápidas de calcular.
- Unicidade: Diferentes entradas devem produzir diferentes hashes (embora colisões sejam possíveis, são raras em boas funções hash).
- Irreversibilidade: Dado um hash, é impraticável reconstruir a entrada original. Não deve ser possível que outra função consiga reverter o processo.
Usos Comuns:
-
Segurança: Hashes são usados para armazenar senhas de forma segura. Por exemplo se um usuário estiver fazendo um cadastro na sua aplicação e digitou a senha, não devemos guardar a senha direto no banco de dados. Qualquer pessoa com acesso ao banco de dados ou atẽ mesmo uma ataque iria expor totalmente as credenciais. Para evitar isso passamos a senha por uma função hash e guardamos o hash no banco. Quando o usuário digitar novamente a senha, passe pela função hash e compare com o valor que você tem no banco de dados.
- Se guardar a senha do usuário em texto puro e esses dados sofrem vazamento o problema pode ser maior do que pensamos. Muitos usuários utilizam a mesma senha em muitos lugares e podemos comprometer muito mais do que acesso a uma aplicação.
Sabendo disso, sempre procure usar 2FA em todas suas senhas quando possível, nunca use a mesma senha e sempre utilize senhas fortes para evitar ataque de força bruta (tentativa e erro).
-
Integridade de Dados: Verificação de integridade de arquivos (como o uso de MD5 ou SHA-256 para verificar se um arquivo foi corrompido ou alterado). Se geramos um hash sobre um arquivo este sempre terá o mesmo hash para a mesma função hash aplicada. No caso da integridade de arquivos podemos usar funções hash mais simples do que usados em senhas.
-
Estruturas de Dados: Em estruturas como tabelas, o hash permitem buscas rápidas. Esta é uma outra funcionalidade muito usada em desenvolvimento e banco de dados, principalmente NoSQL.
-
Criptografia: Hashes fazem parte de muitos algoritmos criptográficos e autenticações.
Exemplos de funções hash comuns:
- MD5: Gera hashes de 128 bits, mas não é mais considerado seguro.
- SHA-1: Gera hashes de 160 bits, mas também tem vulnerabilidades.
- SHA-256: Parte da família SHA-2, é muito mais segura e comumente usada hoje.
Ainda podemos apimentar o hash passando uma função hash sobre a outra para dificultar ainda.
Os algorítmos acima citados foram desenhado para ter eficiencia e são usados principalmente para integridade. Quando falamos de hash de senha usado pelos programadores partimos para algorítmos menos eficientes porém muito mais seguros. Não ser eficiente neste caso é bom, pois quanto mais eficiente for mais força daremos ao hacker que tentará mais vezes por segundo quebrar a senha. Nesse cenário geralmente programadores geralmente utilizam o bcrypt e o PBKDF2 justamente não ter como fazer esses algorítmos serem mais rápidos, é parte do design deles serem mais lentos de rodar dificultando o trabalho de quebrar senhas. Na verdade não são algorítmos de hash e sim de derivação de senhas, feitos para pegar uma senha curta ou fraca e tentar derivar uma senha mais longa e mais forte.
Em resumo, hashes são fundamentais para várias aplicações em tecnologia, especialmente onde a segurança e a integridade dos dados são cruciais.
Hashes e Integridade
Vamos fazer o download do Kubernetes. Se olharmos em changelogs chegamos neste link.
Faça o download de um do arquivos e compare o hash para garantir a integridade dos arquivos. A vantagem de colocar tudo em um único arquivo tar.gz é que podemos passar o hash sobre ele. Copie o link e vamos para o terminal.

❯ wget https://dl.k8s.io/v1.31.0/kubernetes-server-linux-amd64.tar.gz
--2024-08-20 11:50:02-- https://dl.k8s.io/v1.31.0/kubernetes-server-linux-amd64.tar.gz
Resolving dl.k8s.io (dl.k8s.io)... 34.107.204.206, 2600:1901:0:26f3::
Connecting to dl.k8s.io (dl.k8s.io)|34.107.204.206|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://cdn.dl.k8s.io/release/v1.31.0/kubernetes-server-linux-amd64.tar.gz [following]
--2024-08-20 11:50:02-- https://cdn.dl.k8s.io/release/v1.31.0/kubernetes-server-linux-amd64.tar.gz
Resolving cdn.dl.k8s.io (cdn.dl.k8s.io)... 151.101.93.55, 2a04:4e42:16::311
Connecting to cdn.dl.k8s.io (cdn.dl.k8s.io)|151.101.93.55|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 359694851 (343M) [application/x-tar]
Saving to: ‘kubernetes-server-linux-amd64.tar.gz’
kubernetes-server-linux-amd64.tar.gz 100%[===================================================================================================>] 343,03M 3,69MB/s in 94s
2024-08-20 11:51:37 (3,67 MB/s) - ‘kubernetes-server-linux-amd64.tar.gz’ saved [359694851/359694851]
# Vamos passar a mesma função hash e comparar os valores. O valor acima da imagem é 4d73777e4f139c67c4551c1ca30aefa4782b2d9f3e5c48b8b010ffc329065e90ae9df3fd515cc13534c586f6edd58c3324943ce9ac48e60bb4fa49113a2e09d4
❯ sha512sum kubernetes-server-linux-amd64.tar.gz
4d73777e4f139c67c4551c1ca30aefa4782b2d9f3e5c48b8b010ffc329065e90ae9df3fd515cc13534c586f6edd58c3324943ce9ac48e60bb4fa49113a2e09d4 kubernetes-server-linux-amd64.tar.gz
Podemos então confirmar a integridade dos nosso arquivos desta maneira.