Hash

Conheça o componente e saiba como utilizá-lo.

Erick Rubiales avatar
Escrito por Erick Rubiales
Atualizado há mais de uma semana

IMPORTANTE: esta documentação foi descontinuada. Leia a documentação Hash atualizada no nosso novo portal de documentação.

O Hash gera um hash a partir de uma string passada no campo "Payload" caso a operação selecionada seja Hash Payload.

No entanto, se a operação selecionada for Hash Fields, então o componente gera um hash a partir de uma string passada nos campos especificados do JSON de entrada.

Dê uma olhada nos parâmetros de configuração do componente:

  • Crypto Operation: tipos de operação disponíveis - Hash Fields e Hash Payload.

  • Crypto Algorithm: tipo de algoritmo utilizado para gerar o hash. Os possíveis valores para esse parâmetro são MD5, SHA-1, SHA-256, SHA-384, SHA-512, HmacSHA1, HmacSHA256, HmacSHA384, HmacSHA512 e BCrypt.

  • Account: só será exibida caso o algoritmo selecionado no campo Crypto Algorithm seja HmacSHA1, HmacSHA256, HmacSHA384 ou HmacSHA512. A conta deve ser do tipo SECRET_KEY e a chave para fazer o hash deve ser informada.

  • Secret Key: só será exibida se nenhuma for conta selecionada e caso o algoritmo selecionado no campo Crypto Algorithm seja HmacSHA1, HmacSHA256, HmacSHA384 ou HmacSHA512. Essa é uma alternativa para o componente receber a chave para a geração do hash de forma dinâmica.

  • Secret Key Type: só será exibido caso o algoritmo selecionado no campo Crypto Algorithm seja HmacSHA1, HmacSHA256, HmacSHA384 ou HmacSHA512. Esse campo também informa para o componente qual é o tipo da chave informada, que pode ser do tipo String, Hexadecimal ou base64.

  • BCrypt Version: versão do algoritmo BCrypt a ser considerada na geração do hash. Essa opção será disponibilizada apenas quando o valor do parâmetro Crypto Algorithm for BCrypt.

  • Salt: string de 16 bytes adicionada ao valor do hash. Caso não seja informado, será assumido um valor aleatório. Essa opção será disponibilizada apenas quando o valor do parâmetro Crypto Algorithm for BCrypt.

  • Cost Factor: determina a quantidade de rodadas para o hash ser executado. O fator de custo será elevado à potência de 2 e os possíveis valores estão entre 4 e 20. Ex: se o valor do parâmetro for 10, então a quantidade de rodadas para o hash será 2ˆ10 = 1024 rodadas. Essa opção será disponibilizada apenas quando o valor do parâmetro Crypto Algorithm for BCrypt.

    IMPORTANTE: o fator de custo afeta exponencialmente tempo e recursos de processamento, pois o algoritmo será executado consecutivamente de acordo com o número de rodadas obtidas através do resultado do cálculo 2ˆn, no qual n é o fator de custo.

  • JSON Field Path: JSON como caminho do campo string em notação com pontos (dotted notation).

  • Payload: campo para informar diretamente o payload que terá o hash feito. Ele será exibido apenas se a operação selecionada for Hash Payload.

  • Preserve Original: se ativada, a opção preserva o campo original como propriedade "Field" no mesmo nível do original.

  • Result As Hexadecimal: se ativada, a opção mantém o hash em formato hexadecimal; do contrário, o formato será base64.

  • Fail On Error: se a opção estiver habilitada, a execução do pipeline com erro será interrompida; do contrário, a execução do pipeline continua, mas o resultado vai mostrar um valor falso para a propriedade "success".

Fluxo de mensagens

Entrada

Se você selecionar a operação Hash Fields, o componente recebe qualquer mensagem de entrada, mas você deve configurar o caminho para o hash da mensagem na propriedade Json Field Path. Por exemplo:

Json Field Path: data.test

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

Portanto, o componente faz uma busca na propriedade “test”, dentro da propriedade “data”.

Por outro lado, se você selecionar a operação Hash Payload, então a mensagem de entrada deve ser informada dentro do campo Payload.

Saída

Operação Hash Fields

Se você selecionar a operação Hash Fields, a saída contém a mesma estrutura de entrada, porém exibindo o hash da mensagem. Caso a propriedade Preserve Original estiver habilitada, então a saída preserva o campo original no mesmo nível, adicionando o prefixo '_' na frente do campo:

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

Operação Hash Payload

Se você selecionar a operação Hash Payload, a saída exibe a propriedade "result" com o hash da mensagem passada:

{
"result": "3851b1ae73ca0ca6e3c24a0256a80ace"
}

Erro

{
"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”, pois ocorreu um erro na execução

  • message: mensagem de erro do componente

  • error: mensagem de erro recebida do algoritmo de hash

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

  • Result As Hexadecimal: habilitado

Entrada

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

Saída

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

Exemplo 2

  • Crypto Operation: Hash Fields

  • Crypto Algorithm: HmacSHA256

  • Account: vazio

  • Secret Key: 001def0209

  • Secret Key Type: Hexadecimal (a chave passada na propriedade Secret Key deve estar em hexadecimal)

  • JSON Field Path: data.test

  • Preserve Original: habilitado

  • Result As Hexadecimal: habilitado

Entrada

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

Saída

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

Exemplo 3

  • Crypto Operation: Hash Fields

  • Crypto Algorithm: BCrypt

  • Bcrypt Version: 2y

  • Salt: N9qo8uLOickgx2ZM

  • Cost: 6

  • JSON Field Path: data.test

  • Preserve Original: habilitado

Entrada

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

Saída

{
"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"
}
]
}

Operação Hash Payload

Exemplo 1

  • Crypto Operation: Hash Payload

  • Crypto Algorithm: SHA-256

  • Payload: xpto

  • Result As Hexadecimal: habilitado

Saída

{
"result": "2e954593b0b51547656f7f06ec3818a2b42fed46307b81bd493133aa1ce45173"
}

Exemplo 2

  • Crypto Operation: Hash Payload

  • Crypto Algorithm: HmacSHA512

  • Account: vazio

  • Secret Key: 001def0209

  • Secret Key Type: Hexadecimal (a chave passada na propriedade Secret Key deve estar em hexadecimal)

  • Payload: xpto

  • Result As Hexadecimal: habilitado

Saída

{
"result": "517da9449385a43478309459adf9304bd3c8f63cd1d388abd5cbc02b81d8ccb39d303f877019aebfed073166e6c410197e10077f6df3f7a3b3f50adb8cd09580"
}

Exemplo 3

  • Crypto Operation: Hash Payload

  • Crypto Algorithm: BCrypt

  • Bcrypt Version: 2b

  • Salt: N9qo8uLOickgx2ZM

  • Cost: 10

  • Payload: {{ message.data }}

Entrada

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

Saída

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

IMPORTANTE: o fator de custo no algoritmo BCrypt afeta exponencialmente o tempo e os recursos de processamento, pois o algoritmo será executado consecutivamente de acordo com o número de rodadas obtidas através do resultado do cálculo 2^n, no qual "n" é o fator de custo.

Veja alguns exemplos de execução para servir de parâmetro de duração do cálculo do hash. Como premissa para aplicar o hash do algoritmo Bcrypt estão sendo utilizados um payload de 1MB e um fator de custo com o mínimo e o máximo permitido. Os resultados obtidos são:

  • Cost Factor 4

    - Pipeline Small: média de 0.98s

    - Pipeline Medium: média de 0.64s

    - Pipeline Large: média de 0.07s

  • Cost Factor 20

    - Pipeline Small: média de 8m 7s

    - Pipeline Medium: média de 3m 56s

    - Pipeline Large: média de 1m 53s

Os resultados acima podem variar de acordo com o fluxo de integração construído, com o tamanho da mensagem a ter o hash aplicado e com o fator de custo.

Outro ponto importante a ser destacado diz respeito aos limites do fator de custo. O fator de custo do algoritmo Bcrypt permite uma faixa entre 4 e 31. No entanto, fatores acima de 20 acabam consumindo carga de processamento e tempo muito alto, inviabilizando os parâmetros de timeout de execução de um pipeline. Com isso, o componente Hash foi limitado a aceitar no máximo 20 como valor de fator de custo. Partindo dessa premissa, quando for realizado o hash de um valor por meio do componente Hash e com a utilização do algoritmo BCrypt, atente-se ao limite de 20 como fator de custo. Dessa forma são evitados problemas de validação ou checagem no seu fluxo de integração.

Respondeu à sua pergunta?