# Hash

O conector **Hash** permite gerar valores de hash a partir de diferentes tipos de entrada. Dependendo do seu caso de uso, é possível gerar o hash de **campos específicos**, **arquivos** ou do **payload completo**.

Cada opção possui seu próprio conjunto de parâmetros, mas todas seguem a mesma lógica básica: selecionar a **operação**, definir o **algoritmo de hash** e ajustar parâmetros adicionais conforme necessário.

## **Parâmetros**

Os parâmetros de configuração são organizados em abas: **General** e **Documentation**.

* A aba **General** contém todos os campos usados para configurar o conector. Inclui parâmetros que estão sempre visíveis, além daqueles que aparecem dinamicamente de acordo com a **Crypto Operation** selecionada (por exemplo, `Hash Fields`, `Hash File` ou `Hash Payload`) ou com o **Crypto Algorithm** (por exemplo, `HmacSHA256` ou `BCrypt`).
* A aba **Documentation** fornece um campo opcional onde você pode descrever a configuração do conector e adicionar regras de negócio ou observações relevantes.

Os campos que aceitam [expressões Double Braces](https://docs.digibee.com/documentation/connectors-and-triggers/pt-br/double-braces) são marcados na coluna **Suporta DB**.

{% tabs fullWidth="true" %}
{% tab title="General" %}

#### **Parâmetros comuns**

Esses parâmetros são sempre exibidos, independentemente da operação selecionada.

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Tipo de dado</th><th>Suporta DB</th><th>Valor padrão</th></tr></thead><tbody><tr><td><strong>Alias</strong></td><td>Nome (alias) para a saída deste conector, permitindo referenciá-la posteriormente no fluxo usando expressões Double Braces. <a href="../../double-braces/how-to-reference-data-using-double-braces/previous-steps-access">Saiba mais</a>.</td><td>String</td><td>❌</td><td><code>hash-1</code></td></tr><tr><td><strong>Crypto Operation</strong></td><td>Tipo de operação a ser realizada. Valores possíveis: <code>Hash Fields</code>, <code>Hash Payload</code> ou <code>Hash File</code>.</td><td>Seleção</td><td>❌</td><td><code>Hash Fields</code></td></tr><tr><td><strong>Crypto Algorithm</strong></td><td>Tipo de algoritmo usado para gerar o hash. Valores possíveis: <code>MD5</code>, <code>SHA-1</code>, <code>SHA-256</code>, <code>SHA-384</code>, <code>SHA-512</code>, <code>HmacSHA1</code>, <code>HmacSHA256</code>, <code>HmacSHA384</code>, <code>HmacSHA512</code> e <code>BCrypt</code>.</td><td>Seleção</td><td>❌</td><td><code>SHA-512</code></td></tr><tr><td><strong>Result As Hexadecimal</strong></td><td>Quando habilitado, mantém o hash no formato hexadecimal; caso contrário, o formato será base64.</td><td>Booleano</td><td>❌</td><td><code>true</code></td></tr><tr><td><strong>Fail On Error</strong></td><td>Quando habilitado, interrompe a execução do pipeline se ocorrer um erro. Quando desabilitado, a execução continua, mas a propriedade <code>"success"</code> será definida como <code>false</code>.</td><td>Booleano</td><td>❌</td><td><code>false</code></td></tr></tbody></table>

#### **Hash Fields**

Esses parâmetros são exibidos apenas quando a **Crypto Operation** está definida como `Hash Fields`.

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Tipo de dado</th><th>Suporta DB</th><th>Valor padrão</th></tr></thead><tbody><tr><td><strong>JSON Field Path</strong></td><td>Caminho do campo string no JSON, em notação pontuada.</td><td>String</td><td>✅</td><td><code>xml.text</code></td></tr><tr><td><strong>Preserve Original</strong></td><td>Quando ativado, preserva o campo original como uma propriedade <code>"Field"</code> no mesmo nível do campo original.</td><td>Booleano</td><td>❌</td><td><code>true</code></td></tr></tbody></table>

#### **Hash File**

Esses parâmetros são exibidos apenas quando a **Crypto Operation** está definida como `Hash File`.

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Tipo de dado</th><th>Suporta DB</th><th>Valor padrão</th></tr></thead><tbody><tr><td><strong>File Name</strong></td><td>Nome do arquivo ou caminho completo (por exemplo, <code>tmp/processed/file.txt</code>).</td><td>String</td><td>✅</td><td>N/A</td></tr></tbody></table>

#### **Hash Payload**

Esses parâmetros são exibidos apenas quando a **Crypto Operation** está definida como `Hash Payload`.

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Tipo de dado</th><th>Suporta DB</th><th>Valor padrão</th></tr></thead><tbody><tr><td><strong>Payload</strong></td><td>Campo usado para informar diretamente o payload que será convertido em hash.</td><td>String</td><td>✅</td><td>N/A</td></tr></tbody></table>

#### **Configuração baseada no algoritmo**

Esses parâmetros dependem do **Crypto Algorithm** selecionado.

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Tipo de dado</th><th>Suporta DB</th><th>Valor padrão</th></tr></thead><tbody><tr><td><strong>Account</strong></td><td>Exibido apenas quando o <strong>Crypto Algorithm</strong> é um dos seguintes: <code>HmacSHA1</code>, <code>HmacSHA256</code>, <code>HmacSHA384</code> ou <code>HmacSHA512</code>. A conta deve ser do tipo <strong>Secret Key</strong>, e a chave para o hash deve ser informada.</td><td>String</td><td>❌</td><td>N/A</td></tr><tr><td><strong>Secret Key</strong> <code>(DB)</code></td><td>Exibido apenas se nenhuma conta for selecionada e o <strong>Crypto Algorithm</strong> for um dos seguintes: <code>HmacSHA1</code>, <code>HmacSHA256</code>, <code>HmacSHA384</code> ou <code>HmacSHA512</code>. Permite que o conector receba a chave dinamicamente.</td><td>String</td><td>✅</td><td>N/A</td></tr><tr><td><strong>Secret Key Type</strong></td><td>Exibido apenas se nenhuma conta for selecionada e o <strong>Crypto Algorithm</strong> for um dos seguintes: <code>HmacSHA1</code>, <code>HmacSHA256</code>, <code>HmacSHA384</code> ou <code>HmacSHA512</code>. Define o tipo de chave informada — <code>String</code>, <code>Hexadecimal</code> ou <code>Base64</code>.</td><td>Seleção</td><td>❌</td><td><code>Hexadecimal</code></td></tr><tr><td><strong>Charset</strong></td><td>Exibido apenas quando o <strong>Secret Key Type</strong> é <code>String</code>. Define o conjunto de caracteres da chave.</td><td>Seleção</td><td>❌</td><td><code>UTF-8</code></td></tr><tr><td><strong>BCrypt Version</strong></td><td>Exibido apenas quando o <strong>Crypto Algorithm</strong> é <code>BCrypt</code>. Define a versão do algoritmo a ser usada.</td><td>Seleção</td><td>❌</td><td><code>2y</code></td></tr><tr><td><strong>Salt</strong></td><td>Exibido apenas quando o <strong>Crypto Algorithm</strong> é <code>BCrypt</code>. Cadeia de 16 bytes adicionada ao valor do hash. Se não for informada, um valor aleatório será usado.</td><td>String</td><td>✅</td><td>N/A</td></tr><tr><td><strong>Cost Factor</strong></td><td>Exibido apenas quando o <strong>Crypto Algorithm</strong> é <code>BCrypt</code>. Determina o número de rodadas do hash (2^n, em que <em>n</em> é o fator de custo, entre 4 e 20).</td><td>Integer</td><td>❌</td><td><code>4</code></td></tr></tbody></table>
{% endtab %}

{% tab title="Documentation" %}

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Tipo de dado</th><th>Suporta DB</th><th>Valor padrão</th></tr></thead><tbody><tr><td><strong>Documentation</strong></td><td>Campo opcional para descrever a configuração do conector e eventuais regras de negócio relevantes.</td><td>String</td><td>❌</td><td>N/A</td></tr></tbody></table>
{% endtab %}
{% endtabs %}

## **Informações adicionais sobre os parâmetros**

### **Hash gerado**

O conector gera um hash a partir da string informada no campo **Payload** quando a operação selecionada é **Hash Payload**.

Se a operação selecionada for **Hash Fields**, o conector gera o hash a partir da string encontrada nos campos especificados no JSON de entrada.

### **Cost Factor**

No algoritmo **BCrypt**, o fator de custo aumenta exponencialmente o tempo de processamento e os recursos necessários. O algoritmo é executado consecutivamente conforme o número de rodadas derivado do cálculo `2ⁿ`, em que “n” é o fator de custo.

Os exemplos a seguir ilustram como o tempo de execução pode variar conforme o fator de custo. Os testes foram realizados usando um payload de 1 MB e os valores mínimo e máximo permitidos para o algoritmo BCrypt.

**Cost Factor 4**

* **Pipeline pequeno:** Média de 0,98s
* **Pipeline médio:** Média de 0,64s
* **Pipeline grande:** Média de 0,07s

**Cost Factor 20**

* **Pipeline pequeno:** Média de 8m 7s
* **Pipeline médio:** Média de 3m 56s
* **Pipeline grande:** Média de 1m 53s

Esses resultados podem variar dependendo do fluxo de integração, do tamanho da mensagem e do fator de custo aplicado.

O fator de custo do BCrypt pode variar de 4 a 31. No entanto, valores acima de 20 resultam em cargas de processamento e tempos de execução muito altos, frequentemente excedendo os limites de timeout do pipeline. Por esse motivo, o conector **Hash** aceita no máximo o valor **20** para o fator de custo.

Ao usar o algoritmo BCrypt com o conector **Hash**, mantenha o fator de custo dentro desse limite para evitar falhas de validação ou processamento no fluxo de integração.

## **Fluxo de mensagens**

### **Entrada**

#### **Operação: Hash Fields**

Ao usar a operação **Hash Fields**, o conector pode receber qualquer mensagem de entrada, mas é necessário configurar a propriedade **JSON Field Path** para definir onde o hash será aplicado. Por exemplo:

**JSON Field Path:** `data.test`

**Payload:**

```json
{    
    "data":[
        {"test":"xpto"},        
        {"test":"xpto1"},        
        {"test":"xpto2"},        
        {"test":"xpto3"}    
    ]
}
```

Nesse caso, o conector procura a propriedade `test` dentro da propriedade `data`.

#### **Operação: Hash Payload**

Ao usar a operação **Hash Payload**, a mensagem que será convertida em hash deve ser informada no campo **Payload**.

#### **Operação: Hash Files**

Ao usar a operação **Hash Files**, o nome do arquivo deve ser informado no campo **File Name**.

### **Saída**

#### **Operação: Hash Fields**

A saída mantém a mesma estrutura da entrada, mas inclui o hash gerado.

Se a propriedade **Preserve Original** estiver ativada, a saída mantém o campo original e adiciona um novo campo prefixado com um sublinhado (`_`):

{% code expandable="true" %}

```json
{
  "data": [
    {
      "test": "3851b1ae73ca0ca6e3c24a0256a80ace",
     "_test": "xpto"
    },
    {
      "test": "ca9e9bf198149d78f4aad334c838a263",
   "_test": "xpto1"
    },
    {
      "test": "83709b4f9067a83bbdfb0c358dc23a5e",
      "_test": "xpto2"
    },
    {
      "test": "e427f7e6f1bd29d91ea0cc53e40fba12",
      "_test": "xpto3"
    }
  ]
}
```

{% endcode %}

#### **Operação: Hash Payload**

A saída contém a propriedade `result` com o hash da mensagem informada:

```json
{  
    "result": "3851b1ae73ca0ca6e3c24a0256a80ace"
}
```

**Exemplo de erro**

```json
{
  "success": false,
  "message": "Something went wrong while trying to use the HashConnector. Error: java.lang.StringIndexOutOfBoundsException: String index out of range: 1",
  "error": "java.lang.StringIndexOutOfBoundsException: String index out of range: 1"
}
```

* **`success`:** `false` — indica que ocorreu um erro durante a execução.
* **`message`:** mensagem de erro do conector.
* **`error`:** mensagem detalhada de erro retornada pelo algoritmo de hash.

#### **Operação: Hash Files**

A saída exibe uma propriedade `result` contendo o hash gerado de acordo com o algoritmo selecionado.

**Exemplo usando SHA-256:**

```json
{
  "result": "aff746225015b78af3c3f0a7540b10c300d73b3b562cec75ef2df9cfbf7ae2b6"
}
```

## **Hash em ação**

### **Operação: Hash Fields**

#### **Exemplo 1**

* **Crypto Operation:** `Hash Fields`
* **Crypto Algorithm:** `SHA-256`
* **JSON Field Path:** `data.test`
* **Preserve Original:** `true`
* **Result as Hexadecimal:** `true`

**Entrada**

```json
{
    "data": [
        {"test":"xpto"},
        {"test":"xpto1"},
        {"test":"xpto2"},
        {"test":"xpto3"}
    ]
}
```

**Saída**

{% code expandable="true" %}

```json
{
  "data": [
    {
      "test": "2e954593b0b51547656f7f06ec3818a2b42fed46307b81bd493133aa1ce45173",
      "_test": "xpto"
    },
    {
      "test": "8b948d95169f851545f8161fb4dc8e1d37a4c79014ac1d02186fa8946a91aab9",
      "_test": "xpto1"
    },
    {
      "test": "4c9e0d7ca22d9ab7cc675de59226f9477fd847ede13894b835d0ae204139f63a",
      "_test": "xpto2"
    },
    {
      "test": "b5bd5abe3eb5958153af6615df06ccbdfe5857a13da2601f49e4de9fbb102f9a",
      "_test": "xpto3"
    }
 ]
}
```

{% endcode %}

#### **Exemplo 2**

* **Crypto Operation:** `Hash Fields`
* **Crypto Algorithm:** `HmacSHA256`
* **Account:** *(vazio)*
* **Secret Key:** `001def0209`
* **Secret Key Type:** `Hexadecimal` (o valor do campo **Secret Key** deve estar em formato hexadecimal)
* **JSON Field Path:** `data.test`
* **Preserve Original:** `true`
* **Result as Hexadecimal:** `true`

**Entrada**

```json
{
    "data": [
        {"test":"xpto"},
        {"test":"xpto1"},
        {"test":"xpto2"},
        {"test":"xpto3"}
    ]
}
```

**Saída**

{% code expandable="true" %}

```json
{
  "data": [
    {
      "test": "257966929b29a6e0618d47a152e2856a888072400a5cb458fa1d40ff3cedc734",
      "_test": "xpto"
    },
    {
      "test": "ce0e754ab2f57f1fca1a00fce3e834a6940bea8013ae59b6641a4911e349b480",
      "_test": "xpto1"
    },
    {
      "test": "ff0cd9c0df219f99567aeb25d7d5ab9acff3c29728b0f4f71f50e750750a26d5",
      "_test": "xpto2"
    },
    {
      "test": "04a11cbc118ea455c0072e6c70607f68324e5444c8a4795443d25933d9dfa9c6",
      "_test": "xpto3"
    }
  ]
}
```

{% endcode %}

#### **Exemplo 3**

* **Crypto Operation:** `Hash Fields`
* **Crypto Algorithm:** `BCrypt`
* **BCrypt Version:** `2y`
* **Salt:** `N9qo8uLOickgx2ZM`
* **Cost:** `6`
* **JSON Field Path:** `data.test`
* **Preserve Original:** `true`

**Entrada**

```json
{
    "data": [
        {"test":"xpto"},
        {"test":"xpto1"},
        {"test":"xpto2"},
        {"test":"xpto3"}
    ]
}
```

**Saída**

{% code expandable="true" %}

```json
{
    "data": [
        {
            "test": "$2y$06$RhjvZxfzRC7nW0rlcBHYROhJmATBMG6eXfkYkffexdfdFHzzp27Iu",
            "_test": "xpto"
        },
        {
            "test": "$2y$06$RhjvZxfzRC7nW0rlcBHYROm9TaJZ6QQUstIomnJG/Qgc7fPU5x8S.",
            "_test": "xpto1"
        },
        {
            "test": "$2y$06$RhjvZxfzRC7nW0rlcBHYROHAP1dIbNu3SenuQ6B.W9OkJ0/NzYF6e",
            "_test": "xpto2"
        },
        {
            "test": "$2y$06$RhjvZxfzRC7nW0rlcBHYROPsXkmxUVt8Suo8d3GuOl9q0pryw6iJy",
            "_test": "xpto3"
        }
    ]
}
```

{% endcode %}

### **Operação: Hash Payload**

#### **Exemplo 1**

* **Crypto Operation:** `Hash Payload`
* **Crypto Algorithm:** `SHA-256`
* **Payload:** *(qualquer payload)*
* **Result as Hexadecimal:** `true`

**Saída**

```json
{  
    "result": "2e954593b0b51547656f7f06ec3818a2b42fed46307b81bd493133aa1ce45173"
}
```

#### **Exemplo 2**

* **Crypto Operation:** `Hash Payload`
* **Crypto Algorithm:** `HmacSHA512`
* **Account:** *(vazio)*
* **Secret Key:** `001def0209`
* **Secret Key Type:** `Hexadecimal`
* **Payload:** *(qualquer payload)*
* **Result as Hexadecimal:** `true`

**Saída**

```json
{  
  "result": "517da9449385a43478309459adf9304bd3c8f63cd1d388abd5cbc02b81d8ccb39d303f877019aebfed073166e6c410197e10077f6df3f7a3b3f50adb8cd09580"
}
```

#### **Exemplo 3**

* **Crypto Operation:** `Hash Payload`
* **Crypto Algorithm:** `BCrypt`
* **BCrypt Version:** `2b`
* **Salt:** `N9qo8uLOickgx2ZM`
* **Cost:** `10`
* **Payload:** `{{ message.data }}`

**Entrada**

```json
{
    "data": [
        {"test":"xpto"},
        {"test":"xpto1"},
        {"test":"xpto2"},
        {"test":"xpto3"}
    ]
}
```

**Saída**

```json
{  
    "result": "$2b$10$RhjvZxfzRC7nW0rlcBHYROa3UXROXVeKZ3oK4DSc1mV6iJ/pBqBm6"
}
```

### **Operação: Hash Files**

Quando a operação **Hash Files** é selecionada, o conector gera um hash a partir do arquivo informado no campo **File Name**.

O arquivo deve ter sido previamente processado no pipeline, por exemplo, por meio de um conector [**File Writer**](https://docs.digibee.com/documentation/connectors-and-triggers/pt-br/connectors/files/file-writer).

#### **Exemplo**

* **Crypto Operation:** `Hash File`
* **Crypto Algorithm:** `SHA-256`
* **File Name:** `{{ message.fileName }}` (os dados são passados por meio do conector **File Writer**)
* **Result as Hexadecimal:** `true`

**Entrada**

```json
{
  "data": "linha 1",
  "fileName": "test"
}
```

**Saída**

```json
{
  "result": "aff746225015b78af3c3f0a7540b10c300d73b3b562cec75ef2df9cfbf7ae2b6"
}
```
