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.