Hashing se refere ao processo de criaçã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 utilizem criptografia, as chamadas funções hash criptográficas são o núcleo das moedas digitais. Graças a eles, o blockchain e outros sistemas distribuídos são capazes de atingir níveis significativos de integridade e segurança de dados.
As funções hash tradicionais e criptográficas são determinísticas. O significado de ser determinístico é que, desde que a(s) entrada(s) não mude(m), o algoritmo de hash sempre produzirá a mesma saída (também conhecida como Digest ou Hash).
Os algoritmos de hash de criptomoeda são normalmente projetados como funções unidirecionais, o que significa que não podem ser facilmente desfeitos sem uma quantidade significativa de tempo e recursos computacionais. Em outras palavras, é muito fácil obter resultados a partir de insumos, mas relativamente difícil fazer o oposto (obter insumos apenas a partir de produtos). Em geral, quanto mais difícil for encontrar a entrada, mais seguro será o algoritmo de hash.
Como funcionam as funções hash?
Diferentes funções hash produzem saídas de tamanhos diferentes, mas os tamanhos de saída possíveis para cada algoritmo hash são sempre fixos. Por exemplo, o SHA-256 só pode produzir uma saída de 256 bits, enquanto o SHA-1 sempre gera um resumo de 160 bits.
Para ilustrar, vamos executar a palavra “Binance” e “binance” através do algoritmo de hash SHA-256 (que é usado no Bitcoin).
Observe que uma pequena alteração (na forma da primeira letra) resultou em um valor de hash completamente diferente. Mas como estamos usando SHA-256 a saída sempre terá 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, pois as duas saídas permanecerão constantes.
Por outro lado, se executarmos a mesma entrada através do algoritmo hash SHA-1, obteremos os seguintes resultados:
É importante notar que a palavra SHA é uma abreviatura de Secure Hash Algorithms. Refere-se a um conjunto de funções hash criptográficas que inclui os algoritmos SHA-0 e SHA-1 junto com combinações SHA-2 e SHA-3. SHA-256 faz parte do conjunto SHA-2, junto com SHA-512 e outras variantes. Atualmente apenas os blocos SHA-2 e SHA-3 são considerados seguros.
Por que isso é importante?
As funções hash tradicionais têm uma ampla variedade de casos de uso, incluindo pesquisas em bancos de dados, análise de arquivos grandes e gerenciamento de dados. As funções hash criptográficas, por outro lado, são amplamente utilizadas em aplicações de segurança da informação, como autenticação de mensagens e impressão digital. Para o Bitcoin, os hashes criptográficos 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 da segmentação surge ao lidar com grandes quantidades de informações. Por exemplo, um arquivo ou conjunto de dados grande pode ser executado por meio de uma função hash e, em seguida, usar sua saída para verificar rapidamente a precisão e a integridade dos dados. Isso é possível devido à natureza determinística das funções hash: as entradas sempre levam a saídas simplificadas e condensadas (hash). Esta tecnologia elimina a necessidade de armazenar e lembrar grandes quantidades de dados.
Hashing é particularmente útil no contexto da tecnologia blockchain. A blockchain Bitcoin contém muitas operações que incluem hashing, a maioria das quais está no processo de mineração. Na verdade, quase todos os protocolos de criptomoeda dependem de hashing para vincular conjuntos de transações e condensá-los em blocos. E também para criar links criptográficos entre cada bloco, criando efetivamente um blockchain.
Funções hash criptográficas
Novamente, uma função hash que utiliza técnicas criptográficas pode ser definida como uma função hash criptográfica. Hackear uma função hash requer inúmeros ataques de força bruta. Para que uma função hash seja invertida, eles devem adivinhar qual foi a entrada por tentativa e erro até que a saída correspondente seja produzida. Mas também é possível que diferentes entradas produzam 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. Poderíamos descrever essas propriedades como: resistência à colisão, resistência à pré-imagem e resistência à segunda pré-imagem.
Antes de discutir cada propriedade, vamos resumir seu raciocínio em três frases curtas.
Resistência à colisão: não é possível encontrar duas entradas diferentes que produzam o mesmo hash que a saída.
Resistência à pré-imagem: A função hash não pode ser “invertida” (encontre entradas de determinadas saídas).
Resistência da segunda pré-imagem: Nenhuma segunda entrada pode colidir com outra entrada especificada.
Resistência à colisão
Conforme mencionado antes, uma colisão ocorre quando entradas diferentes produzem exatamente o mesmo hash. Conseqüentemente, a função hash é 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.
Em outras palavras, uma função hash é resistente a colisões quando a probabilidade de encontrar uma colisão é tão baixa que exigiria milhões de anos de computação. Portanto, embora não existam funções hash livres de colisão, algumas são fortes o suficiente para serem consideradas resistentes (por exemplo, SHA-256).
Entre os diferentes algoritmos SHA, as combinações SHA-0 e SHA-1 não são mais seguras devido a colisões. Os blocos SHA-2 e SHA-3 são atualmente considerados resistentes a colisões.
Resistência à pré-imagem
A propriedade de resistência da 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 que alguém encontre a entrada que produz uma saída específica.
Lembrando que esse recurso difere do anterior porque um invasor tentará adivinhar qual foi a entrada observando determinadas saídas. Por outro lado, uma colisão ocorre quando alguém encontra entradas diferentes que geram a mesma saída, mas não importa qual entrada foi usada.
A resistência à pré-imagem é valiosa na proteção de dados porque um simples hash de uma mensagem pode provar sua autenticidade sem a necessidade de revelar qualquer 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 fica em algum lugar entre as outras propriedades anteriores. Um ataque de segunda pré-imagem ocorre quando alguém encontra uma entrada específica que gera a mesma saída que 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 que uma saída, 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, uma vez que estes últimos sempre significarão uma colisão. Mas os invasores ainda podem realizar um ataque antecipado a uma função resistente a colisões porque envolve encontrar uma entrada de uma saída.
Mineração
Existem várias etapas no processo de mineração de Bitcoin que contêm funções de hash, como verificação de saldos, vinculação de entradas e saídas a transações e hash de transações dentro de um bloco para formar uma árvore Merkle. Mas uma das principais razões pelas quais a blockchain do Bitcoin é segura é o fato de que os mineradores precisam de incontáveis hashes para encontrar uma solução válida para o próximo bloco.
Especificamente, o minerador deve tentar diversas entradas diferentes ao gerar um valor hash para seu bloco candidato. Em essência, eles só poderão validar seu bloco se gerarem um hash resultante que comece com um certo número de zeros. O número de zeros determina a dificuldade de mineração e varia de acordo com a taxa de hash alocada na rede.
Neste caso, a taxa de hash representa a quantidade de poder computacional 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 para minerar um bloco permaneça próximo de 10 minutos. Por outro lado, se muitos mineiros decidirem parar a mineração, o que levará a uma diminuição significativa na taxa de hash, a dificuldade de mineração será ajustada, o que facilita o processo de mineração (até que o tempo médio de mineração do bloco volte a 10 minutos).
Observe que os mineradores não precisam encontrar colisões porque há um determinado número de hashes que eles podem gerar como saídas válidas (começando com um certo número de zeros). Portanto, existem muitas soluções possíveis para um determinado bloco e os mineradores não precisam encontrar uma delas de acordo com o início determinado pela dificuldade de mineração.
Como a mineração de Bitcoin é muito cara, os mineradores têm poucos motivos para enganar o sistema, pois isso resultará em perdas financeiras significativas. Quanto mais mineradores aderem ao blockchain, mais poderoso ele 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. Os algoritmos hash podem ser versáteis quando combinados com criptografia, fornecendo segurança e autenticação de muitas maneiras diferentes. Como tais funções criptográficas de hash são extremamente importantes para quase todas as redes de criptomoedas. Portanto, compreender suas propriedades e mecanismos de funcionamento é definitivamente útil para qualquer pessoa interessada na tecnologia blockchain.
