O que é Hashing?
Página Inicial
Artigos
O que é Hashing?

O que é Hashing?

Avançado
Publicado em Jul 29, 2019Atualizado em Jan 31, 2023
7m
O Hashing refere-se ao processo de geração de uma saída (output) de tamanho fixo a partir de uma entrada (input) de tamanho variável. Isto é feito através do uso de fórmulas matemáticas conhecidas como funções hash (implementado como algoritmos de hashing). 
Embora nem todas as funções hash envolvam o uso de criptografia, as chamadas funções hash criptográficas são componentes fundamentais das criptomoedas. Graças a elas, blockchains e outros sistemas distribuídos são capazes de alcançar níveis significativos de integridade de dados e segurança.

Tanto as funções hash convencionais como as criptográficas são determinísticas. Ser determinístico significa que enquanto o input não mudar, o algoritmo de hashing sempre produzirá o mesmo output (também conhecido como digest ou hash).

Normalmente, os algoritmos de hashing das criptomoedas são projetados como funções de sentido único, o que significa que elas não podem ser facilmente revertidas sem empregar grandes quantidades de tempo e de recursos computacionais. Em outras palavras, é muito fácil criar o output a partir do input, mas relativamente difícil de ir na direção oposta (gerar o input a partir do output apenas). De um modo geral, quanto mais difícil for de encontrar o input, mais seguro será o algoritmo de hashing.


Como funciona uma função hash?

Diferentes funções hash produzirão outputs de tamanhos diferentes, mas os possíveis tamanhos de output para cada algoritmo de hashing são sempre constantes. Por exemplo, o algoritmo SHA-256 só pode produzir outputs de 256 bits, enquanto o SHA-1 irá sempre gerar um digest de 160 bits.

Para ilustrar, vamos executar as palavras “Binance” e “binance” através do algoritmo de hash SHA-256 (que é usado na Bitcoin).

SHA-256

Input

Output (256 bits)

Binance

f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191

binance

59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2


Note que uma pequena alteração (na primeira letra maiúscula) resultou em um valor de hash totalmente diferente. Mas como estamos usando o SHA-256, os outputs sempre terão um tamanho fixo de 256 bits (ou 64 caracteres) - independentemente do tamanho do input. Além disso, não importa quantas vezes executamos as duas palavras através do algoritmo, os dois outputs permanecerão constantes.

De maneira contrária, se executarmos os mesmos inputs através do algoritmo de hash SHA-1, teríamos os seguintes resultados:

SHA-1

Input

Output (160 bits)

Binance

7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1

binance

e58605c14a76ff98679322cca0eae7b3c4e08936


O acrônimo SHA significa Secure Hash Algorithms (Algoritmos de Hash Seguros). Refere-se a um conjunto de funções hash criptográficas que incluem os algoritmos SHA-0 e SHA-1 em conjunto com os grupos SHA-2 e SHA-3. O SHA-256 faz parte do grupo SHA-2, juntamente com o SHA-512 e outras variantes. Atualmente, apenas os grupos SHA-2 e SHA-3 são considerados seguros.


Por que são importantes?

As funções hash convencionais têm uma ampla variedade de casos de uso, incluindo pesquisas de banco de dados, análises de arquivos grandes e gestão de dados. Por outro lado, as funções hash criptográficas são amplamente usadas em aplicações de segurança da informação, como autenticação de mensagens e impressões digitais. Quando se trata da Bitcoin, as funções hash criptográficas são parte essencial do processo de mineração e também desempenham um papel na geração de novos endereços e chaves.

O verdadeiro poder do hashing está na capacidade de lidar com enormes quantidades de informação. Por exemplo, é possível executar um arquivo grande ou conjunto de dados através de uma função hash e, em seguida, usar seu output para rapidamente verificar a precisão e integridade dos dados. Isso é possível devido à natureza determinística das funções hash: o input sempre resultará em um output simplificado e condensado (hash). Esta técnica descarta a necessidade de “lembrar” e armazenar grandes quantidades de dados.

O hashing é particularmente útil no contexto da tecnologia blockchain. A blockchain da Bitcoin tem várias operações que envolvem hashing, a maioria delas no processo de mineração. Na verdade, quase todos os protocolos de criptomoedas dependem de hashing para vincular e condensar grupos de transações em blocos e também para produzir vínculos criptográficos entre cada bloco, criando efetivamente uma blockchain.


Funções hash criptográficas

Conforme explicado anteriormente, uma função hash que emprega técnicas criptográficas pode ser definida como uma função hash criptográfica. Em geral, romper uma função hash criptográfica requer milhares de tentativas forçadas (brute-force attempts). Para uma pessoa “reverter” uma função hash criptográfica, seria necessário adivinhar qual foi o input através de tentativa e erro até conseguir finalmente gerar o output correspondente. No entanto, também existe a possibilidade de diferentes inputs produzirem exatamente o mesmo output. Nesse caso ocorre o que denomina-se uma “colisão”.

Tecnicamente, uma função hash criptográfica precisa apresentar três propriedades para ser considerada efetivamente segura. Essas propriedades podem ser denominadas como "resistência à colisão", "resistência à pré-imagem" e "resistência à segunda pré-imagem".

Antes de discutir cada propriedade, vamos resumir suas lógicas em três frases curtas.

  • Resistência à colisão: inviável encontrar dois inputs distintos que produzam um mesmo hash como output.

  • Resistência à pré-imagem: inviável “reverter” a função hash (encontrar o input a partir de um determinado output)

  • Resistência à segunda pré-imagem: inviável encontrar qualquer segundo input que colida com um input específico.


Resistência à colisão

Como mencionado, uma colisão ocorre quando diferentes inputs produzem exatamente o mesmo hash. Sendo assim, uma função hash é considerada resistente à colisão até que alguém encontre uma. Note que as colisões sempre existirão para qualquer função hash porque os possíveis inputs são infinitos, enquanto os possíveis outputs são finitos.

Por outro lado, uma função hash é resistente à colisão quando a possibilidade de encontrar uma colisão é tão baixa que exigiria milhões de anos de cálculos computacionais. Portanto, embora não existam funções hash completamente imunes à colisão, algumas delas são suficientemente sólidas para serem consideradas resistentes (por exemplo, o algoritmo SHA-256).

Entre os vários algoritmos SHA, os grupos SHA-0 e SHA-1 são considerados inseguros porque já foram encontradas colisões. Atualmente, os grupos SHA-2 e SHA-3 são considerados resistentes a colisões.


Resistência à pré-imagem

A propriedade de resistência à pré-imagem está relacionada com o conceito de funções de sentido único. Uma função hash é considerada resistente à pré-imagem (preimage-resistant) quando há uma probabilidade muito baixa de alguém encontrar o input que gerou um output específico.

Note que esta propriedade é diferente da anterior porque um agente, ao atacar esse hash, estaria tentando adivinhar qual foi o input ao observar um determinado output específico. Uma colisão, por outro lado, ocorre quando alguém encontra dois inputs diferentes que geram o mesmo output, não importando quais os inputs utilizados.

A propriedade da resistência à pré-imagem é valiosa para proteger dados porque um hash simples de uma mensagem pode provar sua autenticidade, sem necessidade de divulgar as informações contidas nela. Na prática, muitos prestadores de serviços e aplicações da web armazenam e usam hashes gerados a partir de senhas, em vez de simples senhas em texto.


Resistência à segunda pré-imagem

Para simplificar, podemos dizer que a resistência à segunda pré-imagem está em algum lugar entre as outras duas propriedades. Um ataque de segunda pré-imagem ocorre quando alguém é capaz de encontrar um input específico que gera o mesmo resultado de output que um outro input já conhecido.

Em outras palavras, um ataque de segunda pré-imagem envolve encontrar uma colisão, mas em vez de procurar dois inputs aleatórios que geram o mesmo hash, eles buscam um input que gera o mesmo hash que já foi gerado por um outro input específico.

Portanto, qualquer função hash resistente a colisões também é resistente aos ataques de segunda pré-imagem, uma vez que esse tipo de ataque sempre implicará em uma colisão. Porém, ainda é possível fazer um ataque de pré-imagem em uma função resistente à colisão, já que isso implica em encontrar um único input gerado de um único output.


Mineração

Há muitos passos na mineração da Bitcoin que envolvem funções hash, como verificação de saldos, vínculos de inputs e outputs de transações e hashing transações dentro de um bloco para formar um Merkle Tree. Mas um dos principais fatores que faz com que a  blockchain da Bitcoin seja segura é o fato de que os mineradores precisam realizar milhares de operações de hashing para finalmente encontrar uma solução válida para o próximo bloco.
Mais especificamente, um minerador tem que tentar vários inputs diferentes ao criar um valor de hash para seu bloco candidato. Na verdade, eles só serão capazes de validar seu bloco se eles gerarem um hash de saída (output) que começa com um certo número de zeros. O número de zeros é o que determina a dificuldade de mineração, e varia de acordo com a taxa de hash dedicada à rede.

Neste caso, a taxa de hash representa quanto poder computacional está sendo investido na mineração de Bitcoin. Se a taxa de hash da rede aumentar, o protocolo Bitcoin ajustará automaticamente a dificuldade de mineração, para que o tempo médio necessário para minerar um bloco permaneça próximo dos 10 minutos. Em contrapartida, se vários mineradores decidirem parar com a mineração, fazendo com que a taxa de hash caia significativamente, a dificuldade de mineração será ajustada, tornando o processo de minerar mais fácil (até que o tempo médio por bloco volte para 10 minutos).

Note que mineradores não precisam encontrar colisões porque existem múltiplas hashes que eles podem gerar como output válido (a partir de um certo número de zeros). Portanto, existem várias soluções possíveis para um determinado bloco, e os mineradores só precisam encontrar uma delas - de acordo com o limite determinado pela dificuldade de mineração. 

Como a mineração de Bitcoin é uma tarefa de alto custo, os mineradores não têm motivos para enganar o sistema, já que isso conduziria a perdas financeiras significativas. Quanto mais mineradores entrarem em uma blockchain, maior e mais forte ela fica.


Considerações finais

Não há dúvidas de que as funções hash são ferramentas essenciais na ciência da computação, especialmente quando se trata de enormes quantidades de dados. Quando combinados com criptografia, os algoritmos de hashing podem ser muito versáteis, oferecendo segurança e autenticação de muitas maneiras diferentes. Sendo assim, as funções hash criptográficas são vitais para quase todas as redes de criptomoedas, então entender suas propriedades e mecanismos de funcionamento é certamente útil para qualquer pessoa interessada em tecnologia blockchain.