> For the complete documentation index, see [llms.txt](https://ben-hurs-organization.gitbook.io/guia-de-appsec/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ben-hurs-organization.gitbook.io/guia-de-appsec/cheat-sheets/hashing.md).

# 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:

{% code title="shasum" %}

```bash
echo "Teste123" | shasum
091cba669fa3f9068ea9c558739e98f38d826e55

echo "TestE123" | shasum
79d38f274b5fab8f5afd5faaa3dfa14df3fb6f3b
```

{% endcode %}

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`.

{% code title="Argon2 NodeJS" lineNumbers="true" %}

```js
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);
})()
```

{% endcode %}

{% code title="Output" overflow="wrap" lineNumbers="true" %}

```
=== HASH ===
$argon2id$v=19$m=65536,t=3,p=4$ae/dgN/3ETmdxEIKMPiCyw$JMVpje5uNrovinHBi+JuyNc/AOA6N7KZDVXh0vZei7Q

=== MATCH ===
true
```

{% endcode %}

### 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](https://www.passbolt.com/):

{% code title="Passbolt Docker-Compose" lineNumbers="true" %}

```bash
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
```

{% endcode %}

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.
