Hashing se refere ao processo de geração de uma saída de tamanho fixo a partir de uma entrada de tamanho variável. Isto é feito através do uso de fórmulas matemáticas conhecidas como funções hash (implementadas como algoritmos hash).
Embora nem todas as funções hash envolvam o uso de criptografia, as chamadas funções hash criptográficas estão no centro das criptomoedas. Graças a eles, blockchains e outros sistemas distribuídos são capazes de atingir níveis significativos de integridade e segurança de dados.
As funções hash convencionais e criptográficas são determinísticas. Ser determinístico significa que, desde que a entrada não mude, o algoritmo de hash sempre produzirá a mesma saída (também conhecida como resumo ou hash).
Normalmente, os algoritmos de hash de criptomoedas são projetados como funções unilaterais, o que significa que não podem ser facilmente revertidos sem grandes quantidades de tempo e recursos de computação. Em outras palavras, é bastante fácil criar a saída a partir da entrada, mas relativamente difícil ir na direção oposta (gerar a entrada apenas a partir da saída). De modo geral, quanto mais difícil for encontrar a entrada, mais seguro será considerado o algoritmo de hashing.
Como funciona uma função hash?
Diferentes funções hash produzirão saídas de tamanhos diferentes, mas os tamanhos de saída possíveis para cada algoritmo de hash são sempre constantes. Por exemplo, o algoritmo SHA-256 só pode produzir saídas de 256 bits, enquanto o SHA-1 sempre gerará um resumo de 160 bits.
Para ilustrar, vamos executar as palavras “Binance” e “binance” através do algoritmo de hash SHA-256 (aquele usado no Bitcoin).
Observe que uma pequena alteração (a caixa da primeira letra) resultou em um valor de hash totalmente diferente. Mas como estamos usando SHA-256, as saídas sempre terão um tamanho fixo de 256 bits (ou 64 caracteres) - independente do tamanho da entrada. Além disso, não importa quantas vezes executamos as duas palavras no algoritmo, as duas saídas permanecerão constantes.
Por outro lado, se executarmos as mesmas entradas por meio do algoritmo de hash SHA-1, teremos os seguintes resultados:
Notavelmente, a sigla SHA significa Secure Hash Algorithms. Refere-se a um conjunto de funções hash criptográficas que incluem os algoritmos SHA-0 e SHA-1 junto com os grupos SHA-2 e SHA-3. O SHA-256 faz parte do grupo SHA-2, junto com o SHA-512 e outras variantes. Atualmente, apenas os grupos SHA-2 e SHA-3 são considerados seguros.
Por que eles são importantes?
As funções hash convencionais têm uma ampla variedade de casos de uso, incluindo pesquisas em bancos de dados, análises de arquivos grandes e gerenciamento de dados. Por outro lado, as funções hash criptográficas são amplamente utilizadas em aplicações de segurança da informação, como autenticação de mensagens e impressão digital. Quando se trata de Bitcoin, as funções de hash criptográfico são uma 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 surge ao lidar com enormes quantidades de informações. Por exemplo, pode-se executar um grande arquivo ou conjunto de dados por meio de uma função hash e então usar sua saída para verificar rapidamente a precisão e integridade dos dados. Isso é possível devido à natureza determinística das funções hash: a entrada sempre resultará em uma saída simplificada e condensada (hash). Tal técnica elimina a necessidade de armazenar e “lembrar” grandes quantidades de dados.
Hashing é particularmente útil no contexto da tecnologia blockchain. A blockchain do Bitcoin possui diversas operações que envolvem hashing, a maioria delas dentro do processo de mineração. Na verdade, quase todos os protocolos de criptomoeda dependem de hashing para vincular e condensar grupos de transações em blocos, e também para produzir links criptográficos entre cada bloco, criando efetivamente um blockchain.
Funções hash criptográficas
Novamente, uma função hash que implementa técnicas criptográficas pode ser definida como uma função hash criptográfica. Em geral, quebrar uma função hash criptográfica requer uma infinidade de tentativas de força bruta. Para que uma pessoa “reverta” uma função hash criptográfica, ela precisaria adivinhar qual foi a entrada por tentativa e erro até que a saída correspondente fosse produzida. No entanto, existe também a possibilidade de diferentes entradas produzirem exactamente a mesma saída, caso em que ocorre uma “colisão”.
Tecnicamente, uma função hash criptográfica precisa seguir três propriedades para ser considerada efetivamente segura. Podemos descrevê-los como resistência à colisão, resistência à pré-imagem e resistência à segunda pré-imagem.
Antes de discutir cada propriedade, vamos resumir sua lógica em três frases curtas.
Resistência à colisão: inviável encontrar duas entradas distintas que produzam o mesmo hash que a saída.
Resistência à pré-imagem: inviável “reverter” a função hash (encontrar a entrada de uma determinada saída).
Resistência à segunda pré-imagem: inviável encontrar qualquer segunda entrada que colida com uma entrada especificada.
Resistência à colisão
Conforme mencionado, uma colisão acontece quando entradas diferentes produzem exatamente o mesmo hash. Assim, uma função hash é considerada resistente a colisões até o momento em que alguém encontra uma colisão. Observe que sempre existirão colisões para qualquer função hash porque as entradas possíveis são infinitas, enquanto as saídas possíveis são finitas.
Dito de outra forma, uma função hash é resistente a colisões quando a possibilidade de encontrar uma colisão é tão baixa que exigiria milhões de anos de cálculos. Portanto, apesar de não existirem funções hash livres de colisão, algumas delas são fortes o suficiente para serem consideradas resistentes (por exemplo, SHA-256).
Entre os vários algoritmos SHA, os grupos SHA-0 e SHA-1 não são mais seguros porque 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 ao conceito de funções unidirecionais. Uma função hash é considerada resistente à pré-imagem quando há uma probabilidade muito baixa de alguém encontrar a entrada que gerou uma saída específica.
Observe que esta propriedade é diferente da anterior porque um invasor tentaria adivinhar qual foi a entrada observando uma determinada saída. Uma colisão, por outro lado, ocorre quando alguém encontra duas entradas diferentes que geram a mesma saída, mas não importa quais entradas foram utilizadas.
A propriedade de resistência à pré-imagem é valiosa para a proteção de dados porque um simples hash de uma mensagem pode provar sua autenticidade, sem a necessidade de divulgar a informação. Na prática, muitos provedores de serviços e aplicações web armazenam e usam hashes gerados a partir de senhas em vez de senhas em texto simples.
Resistência à segunda pré-imagem
Para simplificar, podemos dizer que a resistência da segunda pré-imagem está em algum lugar entre as outras duas propriedades. Um ataque de segunda pré-imagem ocorre quando alguém consegue encontrar uma entrada específica que gera a mesma saída de outra entrada que já conhece.
Em outras palavras, um ataque de segunda pré-imagem envolve encontrar uma colisão, mas em vez de procurar duas entradas aleatórias que geram o mesmo hash, eles procuram uma entrada que gera o mesmo hash que foi gerado por outra entrada específica.
Portanto, qualquer função hash resistente a colisões também é resistente a ataques de segunda pré-imagem, pois estes sempre implicarão em colisão. No entanto, ainda é possível realizar um ataque de pré-imagem em uma função resistente a colisões, pois isso implica encontrar uma única entrada a partir de uma única saída.
Mineração
Há muitas etapas na mineração de Bitcoin que envolvem funções de hash, como verificação de saldos, vinculação de entradas e saídas de transações e hash de transações dentro de um bloco para formar uma árvore Merkle. Mas uma das principais razões pelas quais o blockchain do Bitcoin é seguro é o fato de que os mineradores precisam realizar uma infinidade de operações de hashing para eventualmente encontrar uma solução válida para o próximo bloco.
Especificamente, um minerador precisa tentar várias entradas diferentes ao criar um valor hash para seu bloco candidato. Em essência, eles só conseguirão validar seu bloco se gerarem um hash de saída que comece 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 quanta energia do computador está sendo investida 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 de 10 minutos. Em contrapartida, se vários mineradores decidirem parar de minerar, fazendo com que a taxa de hash caia significativamente, a dificuldade de mineração será ajustada, facilitando a mineração (até que o tempo médio de bloqueio volte a 10 minutos).
Observe que os mineradores não precisam encontrar colisões porque há vários hashes que eles podem gerar como saída válida (começando com 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 cara, os mineradores não têm motivos para enganar o sistema, pois isso levaria a perdas financeiras significativas. Quanto mais mineradores aderem a uma blockchain, maior e mais forte ela se torna.
Pensamentos finais
Não há dúvida de que as funções hash são ferramentas essenciais na ciência da computação, especialmente quando se trata de grandes quantidades de dados. Quando combinados com criptografia, os algoritmos de hash podem ser bastante versáteis, oferecendo segurança e autenticação de muitas maneiras diferentes. Como tal, as funções de hash criptográficas são vitais para quase todas as redes de criptomoedas, portanto, compreender as suas propriedades e mecanismos de funcionamento é certamente útil para qualquer pessoa interessada na tecnologia blockchain.

