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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ben-hurs-organization.gitbook.io/guia-de-appsec/cheat-sheets/hashing.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
