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?
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).
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
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.