Algoritmos de Hash Criptográficos

Quando se trata de criptografia e integridade de dados, uma das ferramentas mais uteis são os algoritmos de Hash. Capazes de pegar qualquer quantidade de dados e gerar um valor de tamanho conhecido, são usados para garantir a integridade da informação. Neste artigo falarei um pouco sobre eles.

As aplicações de algoritmos de Hash são inúmeras: Desde permitir a detecção de erros durante a transferência de arquivos, autenticação de senhas através de canais inseguros, aceleração de pesquisas de dados, e é uma das bases para a assinatura digital.

Os fundamentos do algoritmos de Hash são os  seguintes:

  1. Dada uma quantidade de dados X de qualquer tamanho, ele retorna um valor Y com um tamanho conhecido.
  2. Qualquer alteração nos dados de entrada X gera um valor Y completamente diferente.
  3. Não há 2 valores de X diferentes que causem o mesmo valor de saída Y. (bom, na real é impossível a criação de um algoritmo de Hash que esta regra seja válida, porém a probabilidade matemática disto ocorrer deve ser muito baixa).
  4. Dado X, é possível calcular Y facilmente, porém dado Y, é quase impossível calcular X. (Ou seja: Não é possível achar o valor que originou a Hash)

Uma aplicação prática, muito usada no mundo do Software Livre: Quando se vai baixar um arquivo (por exemplo, uma distribuição de Linux), geralmente há, no mesmo diretório, um arquivo contendo a Hash md5 ou sha1 – este arquivo contém um código. Com este código é possível verificar a integridade do download: Basta apenas recalcular a Hash do arquivo recém baixado e comparar com a Hash informada no site. Se forem iguais, o arquivo baixado está integro. Se forem diferentes, há diferença nos arquivos.

Existe uma enorme variedade de algoritmos de Hash, os mais usados são o MD5 e o SHA1.

O OpenSSL também é capaz de fazer Hash de arquivos. Para demonstrar, criarei um arquivo chamado “Frederico.txt”, contendo meu nome: “Frederico Pandolfo”. Usando o seguinte comando:

openssl dgst -md5 frederico.txt

obtenho como resposta:
MD5(frederico.txt)= 59f1d1f6b77ad4b860b6ddf6c07b9006

59f1d1f6b77ad4b860b6ddf6c07b9006 é a hash MD5 de “Frederico Pandolfo”.

Não importa quantos bytes tem o arquivo original, o resultado terá sempre o mesmo tamanho (determinado pelo algoritmo usado). É possivel também determinar a Hash SHA1 e SHA512 do meu nome, usando os comandos:

openssl dgst -sha1 frederico.txt
openssl dgst -sha512 frederico.txt

Como resposta, obtenho:

SHA1(frederico.txt)= f3b31f8f0152e016db457d8eb19f06d249b05ee2
SHA512(frederico.txt)= 1a5f2f548823adc2a6928a77c2b075d179cbf2c4b967e27d8a5582120317a6870bc3463ebf71b6426997e61fb6513de75c582999f20e0f257c113e988c474603

O site http://www.hashemall.com/ faz inúmeras Hash usando uma grande variedade de algoritmos, muito bom para fazer experiencias🙂

Há um problema grave com o uso de Hashs para senhas: Um atacante poderia fazer uma tabela contendo palavra e Hash, e neste caso, bastaria ele interceptar a Hash e obter a senha. Este problema é resolvido com o uso de um Salt.

Imagine a seguinte situação: Uma aplicação cliente/servidor utiliza a MD5 da senha para autenticação. Então o usuário digita sua senha: 123456. A aplicação cliente faz a Hash desta senha: E10ADC3949BA59ABBE56E057F20F883E, e envia por um canal não criptografado.

O atacante intercepta esta Hash. Como não há o uso de um Salt, E10ADC3949BA59ABBE56E057F20F883E será sempre correspondente a senha 123456. Logo, sempre que algum usuário enviar a Hash E10ADC3949BA59ABBE56E057F20F883E, a senha será 123456, e o pior de tudo: O atacante não precisará nem saber da senha – é só ele responder com a Hash quando a senha for perguntado (isto chama-se ataque de repetição).

Para impedir isto, o uso de um Salt é importante. Salt é uma informação, que pode ser conhecida pelo atacante, que é incorporada no inicio ou no fim da senha. Resolver este ataque é simples: O cliente deverá perguntar para o servidor por um Salt, e este responderá com alguns bytes aleatórios. O cliente colocara o SALT + Senha e gerará a Hash. A Hash então será enviada para o servidor. Se, por exemplo, o Salt for AA, a senha processada será AA123456, que dará a Hash 48B7B136D16D23B7B522E40883CF1934. Na próxima autenticação, o Salt será diferente, por exemplo, DF, gerando a senha DF123456, o que dará a Hash 9A09939C5488369BA4E3AE6681A852CB. Como o servidor conhece o Salt e a senha, ele saberá que a senha estará correta, e o atacante não poderá simplesmente repetir a mesma hash para autenticar.

Essa passada rápida pelos algoritmos de Hash serve de introdução para o proximo artigo: Assinatura Digital.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: