Você está na página 1de 7

ALGORITMOS DE HASH

Introdução aos hashes


“Segundo Stallings (2015), uma função hash aceita uma mensagem de
tamanho variável e produz uma saída de tamanho fixo. Em outras palavras, hash é
um resumo criptográfico que gera uma saída de tamanho fixo independentemente
do tamanho da entrada” (ZOCHIO, 2015). Esta saída denomina-se “hash” da
mensagem.

Para ter utilidade, o hash deve ter as seguintes características:


 Unidirecionalidade: conhecido um hash, deve ser computacionalmente
impossível encontrar a mensagem original a partir desse resumo.
 Compressão: a partir de um conteúdo de qualquer tamanho, o hash, ao ser
calculado, deve ter tamanho fixo.
 Facilidade de cálculo.
 Difusão: o hash deve ser modificado ao se alterar um só bit da mensagem
original.
 Resistência à colisão: deve ser computacionalmente impossível, conhecida
uma mensagem original M, encontrar outra M’, tal que hash(M) = hash(M’). Esta
característica é chamada de resistência débil à colisão. Também deve ser
computacionalmente impossível encontrar um par (M, M’) de forma que hash(M) =
hash(M’). Isto se chama resistência forte à colisão.
 Resistência à primeira inversão: dado um resumo R, é inviável encontrar
uma mensagem M tal que R= H(M).
 Resistência à segunda inversão: dado um resumo R e uma mensagem M1
tal que R= H(M1), é inviável encontrar uma outra mensagem M2≠M1 tal que R=
H(M2).

Um hash não tem como objetivo garantir confidencialidade, sua função é


prover autenticidade. Veja alguns exemplos de algoritmos de hash:

 MD5 (gera hash de 16 bytes)


 SHA1 (gera hash de 20 bytes)
 SHA256 (gera hash de 256 bytes)
 SHA512 (gera hash de 512 bytes)
 Whirlpool (gera hash de 512 bytes)

Se for obtido um hash MD5 de um arquivo com 1 MB, teremos um hash de 16


bytes. Se o arquivo tiver 1 TB, teremos, igualmente, um hash de 16 bytes.
Se for obtido um hash SHA1 de um arquivo com 1 byte, teremos um hash de
20 bytes. Se o arquivo tiver 900 kB, teremos, igualmente, um hash de 20 bytes.

Uso prático de hashes


Hashes podem ser usados para os seguintes propósitos:

Garantia de autenticidade e integridade: esse é seu principal propósito.


Suponha que você baixou um arquivo da Internet. Como saber se ele está íntegro,
ou seja, foi baixado completamente? Se quem disponibilizou o arquivo fornecer o
hash dele, é só calcular o arquivo baixado e verificar a coincidência com o valor do
hash informado. Se forem iguais, o arquivo está íntegro. Se não, ele está
corrompido.
Essa funcionalidade também é usada em perícia forense computacional, ao
se fazer uma cópia forense de um sistema, um hash dessa cópia é calculado e
registrado na cadeia de custódia. Outro perito, ao periciar essa prova, verificaria se o
hash continua o mesmo. Em caso positivo, a cópia está íntegra; em caso negativo,
ela foi adulterada.
Proteção de dados: embora hashes não sejam algoritmos criptográficos, eles
podem ajudar na segurança de sistemas. Imagine um banco de dados que contém
campos de login e senha que são usados para autenticação de um site. Você
colocaria esses dados em seu formato puro? Não deveria, pois se o banco de dados
for invadido, o invasor coletaria essas informações facilmente.
Se, ao invés de colocar a informação, fossem colocados os hashes dela, a
obtenção dos dados seria dificultada, pois o invasor não saberia de que se tratam
aqueles hashes, uma vez que eles não são reversíveis. O usuário continuaria a
colocar os dados em formato puro nos campos de autenticação, em seguida o
sistema calcularia os hashes e compararia com os hashes do banco de dados. Se
fossem iguais, o acesso seria liberado, caso contrário, não.
Hash MD5

O processo de hashing MD5 pode ser representado como na figura a seguir:

Hash MD5. Fonte: MUNDSCHAU e BOTCHEK (2012).

A seguir, é exibido um round dos 64 realizados:

Fluxo de diagrama de uma operação hash md5.


Fonte: MUNDSCHAU e BOTCHEK (2012)

Agora, serão mostrados alguns exemplos de mensagens, palavras e textos e


seus respectivos hashes. Serão usados como exemplos os algoritmos de hashes
MD5 e SHA1:

Palavra: senha
MD5 = e8d95a51f3af4a3b134bf6bb680a213a
SHA1= 7751a23fa55170a57e90374df13a3ab78efe0e99

Palavra: SENHA
MD5= 85ee0fe4f155a9af2657d85054ad63ca
SHA1= 111991cc05cbe8a3cec2776d0c4d099f0c72a6de

Palavra: 1234
MD5 = 81dc9bdb52d04dc20036dbd8313ed055
SHA1= 7110eda4d09e062aa5e4a390b0a572ac0d2c0220

“” (valor nulo)
MD5 = d41d8cd98f00b204e9800998ecf8427e
SHA1 = da39a3ee5e6b4b0d3255bfef95601890afd80709

Colisão de hash
Idealmente, o hash deve ser único para cada arquivo. Essa é uma das suas
principais funções, entretanto, em alguns casos, acontece de duas “coisas” digitais
possuírem o mesmo hash calculado no mesmo algoritmo. Esse fenômeno é
chamado de “colisão de hash”. Quando isso ocorre, o algoritmo de hash deixa de ser
capaz de prover autenticidade, porém ainda pode ser usado para comprovar a
integridade daquele arquivo digital.
O caso mais famoso foi o do MD5, no qual uma equipe de pesquisadores
chineses encontrou possibilidades de colisão, por meio de ataques usando
criptoanálise (Wang e Yu, 2009). Pode-se até forjar colisões de hash no MD5.
Para evitar estes problemas, deve-se usar algoritmos de hash que até o
momento não apresentem colisões comprovadas.
Falhas como essa podem, por exemplo, colocar em dúvida a integridade de
uma prova pericial, considerar autênticas mensagens ou arquivos adulterados, ou
ainda fornecer acesso indevido a sistemas por meio de certificados digitais falsos.

Ataque do aniversário contra hashes


“O ataque de aniversário é baseado em um problema de estatística”
(ZOCHIO, 2016).
Também conhecido como “paradoxo do aniversário”, não é um paradoxo
verdadeiro, mas os resultados fizeram com que o problema recebesse este apelido.
Ele se baseia em duas perguntas:
“Quantas pessoas precisam estar numa sala para que a probabilidade de
alguém fazer aniversário no mesmo dia que você seja maior do que 50%? A
resposta é: 253 pessoas.
Quantas pessoas precisam estar numa sala para que a probabilidade de que
duas delas façam aniversário no mesmo dia seja maior do que 50%? A resposta é
23: pessoas.
Embora pareça ilógico, são mesmo necessárias apenas 23 pessoas para que
se tenha mais de 50% de chance de acertar ao afirmar que duas delas fazem
aniversário no mesmo dia. Este é o “paradoxo”. Para provar que os números estão
corretos, basta usar estatística.
Considerando o número de dias do ano como 365 (excluindo anos bissextos
e que há pessoas que nasceram no dia 29 de fevereiro) e que o número de
nascimentos esteja igualmente distribuído em todos os dias do ano, cada um dos
presentes na sala tem apenas 364 chances em 365 de não fazer aniversário no
mesmo dia em que você. Isto representa 364/365 = 0,997260274, ou seja,
aproximadamente 99,73%. Como o inverso é verdadeiro, e considerando apenas
uma pessoa, a chance de que você e ela façam aniversário no mesmo dia é 1 -
0,997260274 = 0,002739726 ou cerca de 0,27%.
À medida que o número de pessoas consideradas aumenta, as chances se
multiplicam. Se considerarmos duas pessoas, a probabilidade de que nenhuma
delas faça aniversário no mesmo dia que você será (364/365) × (364/365) ou
(364/365)2 e que pelo menos uma delas faça aniversário junto com você será
novamente o inverso 1 - (364/365)2. Aumente este número para 3, 4, 5 pessoas, de
modo sucessivo até encontrar uma probabilidade maior que 0,50 ou 50%. A fórmula
para calcular a probabilidade pode ser deduzida dos exemplos dados: será 1 menos
(364/365) elevado ao número de pessoas consideradas. Se representarmos o
número de pessoas por n obtemos:
1 - (364/365)n

Considerando os cálculos com 252 pessoas, o resultado será 1 - (364/365)252


= 0,499104839 ou 49,91%. Repetindo os cálculos com 253 pessoas, chega-se à
marca de 0,500477154, praticamente 50,05%.
No entanto, e se o foco for mudado para encontrar duas pessoas que fazem
aniversário na mesma data do ano?
Supondo que haja um calendário em uma sala, quando entra a primeira
pessoa, ela marca no calendário o dia do seu aniversário. Até então não existe
ninguém para compartilhar o aniversário com ela; portanto, a chance de repetir o
próprio aniversário é 1 ou 100%. A seguir, entra uma segunda pessoa na sala. A
chance que ela tem de não fazer aniversário no mesmo dia da primeira pessoa é de
364 em 365, ou seja, 364/365 = 0,997260274 (99,73%). Portanto, a multiplicação
das chances de não fazer aniversário no mesmo dia é 1 × 0,997260274 =
0,997260274 e a chance de fazer aniversário no mesmo dia é de 1 - 0,997260274 =
0,002739726 (0,27%).
Até aqui, não mudou nada do que se viu até agora. Porém, quando a terceira
pessoa entrar na sala, a chance de marcar um dia que ainda não tenha sido
escolhido será de 363 em 365, ou seja, 363/365 = 0,994520548 ou 99,45% e a
multiplicação de chances será 1 × 0,997260274 × 0,994520548 = 0,991795834
(99,18%). Neste caso, a chance de repetir uma das datas será 1 - 0,991795834 =
0,008204166 ou 0,82%.
Os exemplos supracitados mostram que as chances de não repetir
aniversários vão diminuindo e que as chances de repetir aniversários vão
aumentando. Se for designado o número de pessoas como n, a chance de os
aniversários não coincidirem será:

(365 - n + 1) / 365

e a chance multiplicada de que os aniversários não se repitam será:

(364/365) × (363/365) × (362/365) × ... × ((365 - n + 1)/365)

Para obter a chance de que um dos aniversários se repita, é preciso subtrair o


resultado obtido com a última fórmula de 1:
1 - ((364/365) × (363/365) × (362/365) × ... × ((365 - n + 1)/365))

Então, quando n = 23, o resultado obtido é 0,507297234 ou 50,73%. O


método para achar n é calcular as chances de os aniversários não se repetirem e
depois calcular o inverso”. (BLOG NUMA BOA, s.d.; ZOCHIO, 2016)

Para compreender a relação deste “paradoxo” com hashes, é necessário


adaptar suas perguntas. Vejamos:
 Quantos arquivos digitais precisam estar em uma mesma sala para que a
probabilidade de algum deles ter o mesmo hash que um arquivo digital especifica
seja maior que 50%?
 Quantos arquivos digitais precisam estar em uma sala para que a
probabilidade de que dois deles tenham o mesmo hash seja maior do que 50%?

Portanto, é mais fácil encontrar colisões entre arquivos aleatórios do que em


arquivos específicos. Esse princípio facilita o teste de colisão de hash e o torna mais
rápido.

Você também pode gostar