Pular para conteúdo

"Funções" Hash

É uma "função" matemática que recebe um input de tamanho indeterminado e devolve um identificador único de tamanho fixo que não pode ser revertido ao input original. O diferencial dos algorítmos de hash é que duas informações similares com uma diferença mínima de um único bit geram hashes completamente diferente um do outro.

Aplicações

Hash normalmente está relacionado com identificação e integridade.

  • Verificação de integridade na transferência de arquivos: ao realizar o hashing de um arquivo antes e depois da transferência, caso os hashes resultantes continuem iguais, o arquivo também permanece o mesmo.
  • Armazenamento de senhas para futuras autenticações: ao invés de armazenar a senha no sistema e dar chance ao atacante fazer uma forense e ler a senha armazenada, o Linux salva somente o hash das senhas no /etc/shadow. Dessa forma, quando um usuário inserir a senha para fazer login, o input dele entra no algorítimo de hash do sistema e o hash resultante é comparado com o hash da senha. Se forem iguais, o input inserido de fato era a senha.

Característiscas:

  • Input de tamanho e valor varíavel. Usa-se todo o conteúdo dos arquivos, byte a byte.
  • Output de tamanho fixo, mas conteúdo extremamente variado a cada mudança, seja ela a mínima que for.
  • Se H(in) = out é a função Hash, não há como conseguir in novamente através somente da informação out.

Colisões

Algorítmos de hashing podem possuir colisões, ou seja, inputs diferentes que geram outputs iguais, o que tira o posto identificador único. Para evitar colisões, podemos escolher algorítmos que não possuem colisões conhecidas ou identificar um malware através de hashes gerados por algorítmos diferentes. A chance de ambos gerarem colisões no mesmo caso é extremamente baixa.

Algorítmos de hashing:

  • MD5 (possui coliões previsíveis)
  • SHA1 (possui colisões previsíveis)
  • SHA2:
    • SHA256
    • SHA384
    • SHA512

Brute Force, Rainbow table, Salt e charound

Brute Force (força bruta) é um ataque que usa de tentativas repetitivas, de input e output para achar correspondências ou padrões. Se um algorítimo de hash é muito pequeno, ele pode ser quebrado à força. Mas sendo um pouco maior, pode demorar séculos até quebrar.

Ataques por rainbow tables são uma alternativa ao brute force. A expressão rainbow table se refere a grandes bancos de dados que mapearam alguns padrões conhecidos e clássicos de output do algorítmo de hash para inputs comuns, ajudando por exemplo a quebrar senhas como "adminadmin" ou "12345".

A fim de contornar rainbow tables, usam-se salts no algorítmo de hash. Salts são uma sequência aleatória de texto ou baseada em algum outro fator difícil de replicar. O Salt é concatenado ao input do algorítmo de hash e por isso muda completamente o hash resultante.

Exemplo com hash no /etc/shadow do linux

fulano:$1$dawdgsad$sALDKA~DDAWLSfawfsahgkul:130422:0:99999:30:::


Estrutura (separado por ":"):

usuário :
$ algorítmo $ sal $ hash resultante :
ultima data de modificação :
mínimo de dias para liberar modificação de senha :
máximo de dias para liberar modificação de senha :
nº de dias antes da senha expirar para avisar da expiração:
nº de dias após senha expirada em que a conta será desabilitada:
data de expiração da conta):

Charound também é outra técnica para evitar rainbow tables e brute force. Baseia-se em aplicar o hash múltiplas vezes ao invés de só uma vez, aumentando em muito a complexidade assintótica de adquirir os padrões comuns de rainbow table.