

Hashing é o processo de produzir um output de tamanho fixo a partir de um input de dimensão variável. Isto faz-se através de fórmulas matemáticas designadas funções de hash (implementadas como algoritmos de hashing).
Embora nem todas as funções de hash envolvam criptografia, as chamadas funções de hash criptográficas são fundamentais nas criptomoedas. É graças a estas funções que blockchains e outros sistemas distribuídos conseguem elevados níveis de integridade e segurança dos dados.
As funções de hash, tanto convencionais como criptográficas, são determinísticas. Isto significa que, enquanto o input se mantiver inalterado, o algoritmo de hashing irá sempre gerar o mesmo output (também conhecido por digest ou hash).
Regra geral, os algoritmos de hashing de criptomoedas são concebidos como funções unidirecionais, pelo que não podem ser revertidos facilmente sem recursos computacionais e tempo consideráveis. Ou seja, é simples gerar o output a partir do input, mas é difícil fazer o inverso (recriar o input apenas a partir do output). Em geral, quanto mais difícil for descobrir o input, mais seguro é o algoritmo de hashing.
Funções de hash diferentes produzem outputs de tamanhos distintos, mas o tamanho do output de cada algoritmo de hashing é sempre constante. Por exemplo, o SHA-256 apenas gera outputs de 256 bits, enquanto o SHA-1 gera sempre um digest de 160 bits.
Como exemplo, vejamos as palavras "ExampleText" e "exampletext" processadas pelo algoritmo SHA-256 (utilizado no Bitcoin).
| Input | Output (256 bits) |
|---|---|
| ExampleText | f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191 |
| exampletext | 59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2 |
Note-se que uma alteração mínima (a capitalização da primeira letra) origina um valor de hash totalmente diferente. Contudo, ao utilizarmos SHA-256, os outputs terão sempre 256 bits (ou 64 caracteres), independentemente do tamanho do input. Além disso, não importa quantas vezes processemos as palavras pelo algoritmo, os dois outputs permanecerão invariáveis.
Por outro lado, se processarmos estes inputs pelo algoritmo SHA-1, os resultados serão os seguintes:
| Input | Output (160 bits) |
|---|---|
| ExampleText | 7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1 |
| exampletext | e58605c14a76ff98679322cca0eae7b3c4e08936 |
O acrónimo SHA significa Secure Hash Algorithms, referindo-se a um conjunto de funções de hash criptográficas que inclui os algoritmos SHA-0, SHA-1, bem como os grupos SHA-2 e SHA-3. O SHA-256 integra o grupo SHA-2, juntamente com o SHA-512 e outras variantes. Atualmente, apenas os grupos SHA-2 e SHA-3 são considerados seguros.
Funções de hash convencionais têm aplicações diversas, como pesquisas em bases de dados, análise de grandes ficheiros e gestão de dados. Já as funções de hash criptográficas são amplamente usadas em segurança da informação, nomeadamente na autenticação de mensagens e impressão digital. No universo Bitcoin, as funções de hash criptográficas são essenciais na mineração e na geração de novos endereços e chaves.
O verdadeiro potencial do hashing revela-se na gestão de grandes volumes de informação. Por exemplo, é possível processar um ficheiro ou conjunto de dados volumoso através de uma função de hash e usar o respetivo output para verificar rapidamente a precisão e integridade dos dados. Isto é possível devido ao carácter determinístico das funções de hash: o input origina sempre um output simplificado e condensado (hash). Esta técnica elimina a necessidade de armazenar grandes quantidades de dados.
O hashing é especialmente relevante na tecnologia blockchain. A blockchain do Bitcoin integra várias operações baseadas em hashing, sobretudo na mineração. Na verdade, praticamente todos os protocolos de criptomoedas dependem do hashing para agregar e condensar transações em blocos, bem como para criar ligações criptográficas entre blocos, formando assim uma blockchain.
Uma função de hash que recorre a técnicas criptográficas é designada função de hash criptográfica. Em geral, quebrar uma destas funções exige inúmeros ensaios de força bruta. Para “reverter” uma função de hash criptográfica, seria necessário adivinhar o input por tentativa e erro até se produzir o output correspondente. Contudo, pode acontecer que inputs diferentes gerem exatamente o mesmo output, o que se designa “colisão”.
Tecnicamente, uma função de hash criptográfica deve cumprir três propriedades para ser considerada segura: resistência a colisões, resistência à pré-imagem e resistência à segunda pré-imagem.
Antes de detalhar cada uma, resumimos a lógica de cada propriedade em três frases:
Como referido, uma colisão ocorre quando inputs diferentes produzem o mesmo hash. Assim, considera-se uma função resistente a colisões enquanto ninguém encontrar uma colisão. Note-se que as colisões são inevitáveis em qualquer função de hash, pois o número de inputs possíveis é infinito e o de outputs é finito.
Por outras palavras, uma função de hash é resistente a colisões quando a probabilidade de se encontrar uma colisão é tão baixa que exigiria milhões de anos de computação. Assim, embora não existam funções imunes a colisões, algumas são suficientemente robustas para serem consideradas resistentes (como o SHA-256).
Entre os vários algoritmos SHA, os grupos SHA-0 e SHA-1 deixaram de ser seguros devido à ocorrência de colisões. Atualmente, apenas os grupos SHA-2 e SHA-3 são considerados resistentes a colisões.
A resistência à pré-imagem relaciona-se com as funções unidirecionais. Uma função de hash é resistente à pré-imagem quando é muito improvável que alguém descubra o input que originou um determinado output.
Esta propriedade distingue-se da anterior porque aqui o atacante tenta adivinhar o input a partir de um output conhecido. Já uma colisão ocorre quando se encontram dois inputs diferentes que originam o mesmo output, independentemente dos inputs utilizados.
A resistência à pré-imagem protege os dados, já que um simples hash de uma mensagem pode comprovar a sua autenticidade sem revelar a informação original. Na prática, muitos serviços e aplicações web armazenam e usam hashes de palavras-passe em vez das próprias palavras-passe em texto simples.
De modo simplificado, a resistência à segunda pré-imagem situa-se entre as duas propriedades anteriores. Um ataque de segunda pré-imagem ocorre quando se consegue encontrar um input que origina o mesmo output de outro input já conhecido.
Ou seja, neste ataque procura-se um input que produza o mesmo hash de um input específico, em vez de dois quaisquer.
Assim, qualquer função de hash resistente a colisões é também resistente a ataques de segunda pré-imagem, pois estes implicam sempre uma colisão. No entanto, ainda é possível realizar um ataque de pré-imagem numa função resistente a colisões, visto que implica encontrar apenas um input a partir de um output.
Existem várias etapas da mineração de Bitcoin que envolvem funções de hash, como a verificação de saldos, ligação entre inputs e outputs das transações e o hashing de transações de um bloco para formar uma Merkle Tree. Contudo, um dos principais motivos para a segurança da blockchain do Bitcoin reside no facto de os mineradores realizarem inúmeras operações de hashing até encontrarem uma solução válida para o próximo bloco.
Em concreto, o minerador tem de testar diferentes inputs ao criar um hash para o seu bloco candidato. Só conseguirá validar o bloco se gerar um hash de output que comece com um número específico de zeros. O número de zeros define a dificuldade de mineração, que varia consoante o hash rate da rede.
Neste contexto, o hash rate representa a quantidade de poder computacional dedicada à mineração de Bitcoin. Se o hash rate global aumentar, o protocolo Bitcoin ajusta automaticamente a dificuldade de mineração para que o tempo médio de mineração de um bloco se mantenha próximo de 10 minutos. Pelo contrário, se muitos mineradores abandonarem a mineração e o hash rate baixar drasticamente, a dificuldade é ajustada para facilitar a mineração (até o tempo por bloco regressar aos 10 minutos).
Importa referir que os mineradores não precisam de encontrar colisões, pois existem múltiplos hashes possíveis que cumprem o critério (começar com determinado número de zeros). Ou seja, há várias soluções possíveis para cada bloco e basta ao minerador encontrar uma delas — conforme o limiar estabelecido pela dificuldade de mineração.
Sendo a mineração de Bitcoin uma tarefa dispendiosa, os mineradores não têm incentivo para defraudar o sistema, já que tal resultaria em perdas financeiras relevantes. Quanto mais mineradores aderirem a uma blockchain, maior e mais robusta esta se torna.
As funções de hash são ferramentas indispensáveis na informática, especialmente na gestão de grandes volumes de dados. Quando associadas à criptografia, os algoritmos de hashing tornam-se altamente versáteis, proporcionando segurança e autenticação sob diversas formas. As funções de hash criptográficas são, por isso, essenciais em praticamente todas as redes de criptomoedas; compreender as suas propriedades e mecanismos de funcionamento é fundamental para quem se interessa pela tecnologia blockchain.
Hashing é uma função que transforma dados de qualquer tamanho num output de dimensão fixa. Garante a integridade e segurança dos dados na blockchain ao criar impressões digitais únicas. Até pequenas alterações nos dados originam hashes totalmente distintos, tornando este método ideal para verificação e proteção criptográfica.
As funções de hash processam dados de input para gerar outputs de comprimento fixo através de algoritmos matemáticos. O mesmo input origina sempre o mesmo output devido ao carácter determinístico destas funções — seguem regras computacionais consistentes, assegurando a reprodutibilidade e fiabilidade nas operações criptográficas.
O hashing é utilizado na verificação da integridade dos dados, assinaturas digitais, autenticação de palavras-passe e segurança em blockchain. Garante que os dados não foram adulterados e permite a verificação segura da identidade em sistemas criptográficos.
O hashing gera outputs de tamanho fixo e é irreversível, servindo para verificação de integridade. A encriptação é reversível e protege a confidencialidade dos dados. O hashing não permite decifrar dados; a encriptação pode ser revertida com a chave apropriada.
Uma boa função de hash deve apresentar resistência a colisões para evitar conflitos, resistência à alteração (alterações mínimas nos dados produzem outputs amplamente diferentes) e elevada eficiência de consulta para recuperação rápida de dados.
Os algoritmos de hashing mais utilizados são o MD5, SHA-1 e SHA-256. O MD5 gera hashes de 128 bits, mas apresenta vulnerabilidades de segurança conhecidas. O SHA-256 produz hashes de 256 bits e oferece maior segurança. O SHA-1 está obsoleto. O SHA-256 é amplamente preferido em blockchain pela sua robustez e resistência a colisões.











