Hashing

Quando precisamos que algo seja transformado em um valor de tamanho fixo e que seja impossível retornar para seu conteúdo original, utilizamos hashing.

Os algs que costumamos ver são MD5, SHA256 e BCRYPT. Cada um com seu objetivo específico.

A característica principal do hashing é que ele gera um valor completamente diferente se um único byte mudar, veja:

shasum
echo "Teste123" | shasum
091cba669fa3f9068ea9c558739e98f38d826e55

echo "TestE123" | shasum
79d38f274b5fab8f5afd5faaa3dfa14df3fb6f3b

Os casos mais comuns que temos aqui são armazenamento de senhas e digest para verificação de integridade.

Explicando cada um deles:

Armazenamento de Senhas

Ao armazenar senhas no banco de dados, devemos utilizar algorítmos fortes de hashing.

O indicado é utilizar BCRYPT ou ARGON2.

Estes algs tem uma característica importante: você não precisa armazenar separadamente o SALT.

Argon2 NodeJS
const argon2 = require('argon2');

(async () => {
  const password = "M1P@ssW0rd!";

  const hash = await argon2.hash(password);
  console.log('=== HASH ===')
  console.log(hash);
  
  const match = await argon2.verify(hash, password);
  console.log('\n=== MATCH ===')
  console.log(match);
})()
Output
=== HASH ===
$argon2id$v=19$m=65536,t=3,p=4$ae/dgN/3ETmdxEIKMPiCyw$JMVpje5uNrovinHBi+JuyNc/AOA6N7KZDVXh0vZei7Q

=== MATCH ===
true

Digest para verificação de integridade

Quando baixamos algum software ou instalamos algum pacote, você já deve ter visto que eles tem um checksum, não?

Como exemplo, vamos pegar as instruções de instalação do Passbolt:

Passbolt Docker-Compose
wget "https://raw.githubusercontent.com/passbolt/passbolt_docker/master/docker-compose/docker-compose-ce.yaml"

[ "$(sha256sum docker-compose-ce.yaml | awk '{print $1}')" = "3ff1cb219ae028293ba29f808d0ed17695aeb69a3baa9399194c214881f6409e" ] && echo "Checksum OK" || (echo "Bad checksum. Aborting" && rm -f docker-compose-ce.yaml)

docker-compose -f docker-compose-ce.yaml up -d

Agora presta atenção em duas partes:

sha256sum docker-compose-ce.yaml
3ff1cb219ae028293ba29f808d0ed17695aeb69a3baa9399194c214881f6409e

O que está sendo feito aqui é gerar um hash usando sha256 do conteúdo do arquivo docker-compose-ce.yaml e comparando com um valor fixo.

Mas qual o motivo disso ter sido feito?

Vou te responder isso com outra pergunta: como saber se o software que você está baixando ou executando é oficial e não uma versão maliciosa alterada?

O fabricante fornecerá o software e também o hash, assim você poderá garantir que é o mesmo ao baixar.

Last updated