Um hash "seguro" é um hash que se acredita ser difícil de "falsificar" de uma maneira reproduzível e de fórmula, sem o conhecimento prévio da mensagem usada para criar o hash. Como essas informações geralmente são secretas, daí a necessidade de um hash, essa é uma boa propriedade de uma função de hash destinada ao uso na autenticação.
Um hash é geralmente considerado "seguro" se, dada uma mensagem M, uma função de hash hash () e um valor de hash H produzido por hash (M) com um comprimento em bits L, nenhum dos seguintes itens puder ser executado em menos de Tempo O (2 L ):
- Dado o hash () e o H, produza M. (resistência à pré-imagem)
- Dado o hash () e o M, produza um M 2 diferente, de tal modo que o hash (M 2 ) == H. (resistência à colisão fraca)
- Dado o hash (), produza qualquer M 1 e M 2 tal que o hash (M 1 ) == hash (M 2 ). (forte resistência à colisão)
Além disso, um hash "seguro" deve ter um comprimento de hash L tal que 2 Lnão é um número possível de etapas para um computador executar o hardware atual fornecido. Um hash inteiro de 32 bits pode ter apenas 2,1 bilhões de valores; enquanto um ataque de pré-imagem (encontrar uma mensagem que produz um hash específico H) levasse um tempo, não é inviável para muitos computadores, especialmente aqueles nas mãos de agências governamentais fretadas com quebra de código. Além disso, um algoritmo que cria e armazena mensagens aleatórias e seus hashes teria, de acordo com a probabilidade, 50% de chance de encontrar um hash duplicado com cada nova mensagem após tentar apenas 77.000 mensagens, e teria 75% de chance de atingir um duplicar depois de apenas 110.000. Até os hashes de 64 bits ainda têm 50% de chance de colidir depois de tentar apenas cerca de 5 bilhões de valores. Tal é o poder do ataque de aniversário em pequenos hashes. Por contraste,decilhões de números (1,5 * 10 34 ).
Os ataques mais demonstrados aos hashes criptográficos foram ataques de colisão e demonstraram a capacidade de gerar mensagens de colisão em menos de 2 L de tempo (a maioria ainda tem tempo exponencial, mas reduzir o expoente pela metade é uma redução significativa na complexidade, pois um hash de 256 bits tão fácil de resolver quanto um de 128 bits, um 128 bits tão fácil de resolver quanto um de 64 bits, etc.).
Além do tamanho pequeno do hash, outros fatores que podem tornar um hash comprovadamente inseguro são:
Pouco trabalho - um hash projetado para uso por uma hashtable ou para outros fins do tipo "soma de verificação" geralmente é projetado para ser computacionalmente barato. Isso facilita muito o ataque de força bruta.
"Sticky State" - A função de hash é propensa a padrões de entrada em que o valor atual de hash de todas as entradas até agora não muda quando é fornecido um byte adicional específico de entrada. Ter "estado de aderência" facilita a localização de colisões, pois depois de identificar uma mensagem que produz um hash de "estado de aderência", é trivial gerar outras mensagens com o mesmo hash, acrescentando bytes de entrada que mantêm o hash em seu "estado de aderência" "
Difusão - Cada byte de entrada da mensagem deve ser distribuído entre os bytes do valor do hash de maneira igualmente complexa. Certas funções de hash criam alterações previsíveis em certos bits no hash. Isso novamente torna a criação de colisões trivial; dada uma mensagem que produz um hash, as colisões podem ser facilmente criadas introduzindo novos valores à mensagem que afetam apenas os bits que mudam previsivelmente.