Não, não é possível reverter uma função de hash como MD5: dado o valor do hash de saída, é impossível encontrar a mensagem de entrada, a menos que sejam conhecidas informações suficientes sobre a mensagem de entrada.
A descriptografia não é uma função definida para uma função de hash; criptografia e descriptografia são funções de uma cifra como AES no modo CBC; funções de hash não criptografam nem descriptografam . As funções de hash são usadas para digerir uma mensagem de entrada. Como o nome indica, não há algoritmo reverso possível por design .
O MD5 foi projetado como uma função de hash criptograficamente segura e unidirecional . Agora é fácil gerar colisões para o MD5 - mesmo que grande parte da mensagem de entrada seja predeterminada. Portanto, o MD5 é oficialmente quebrado e o MD5 não deve mais ser considerado um hash criptograficamente seguro. No entanto, ainda é impossível encontrar uma mensagem de entrada que leve a um valor de hash: encontre X quando apenas H (X) for conhecido (e X não tiver uma estrutura pré-calculada com pelo menos um bloco de 128 bytes de dados pré-computados) . Não há ataques de pré-imagem conhecidos contra o MD5.
Também é geralmente possível adivinhar senhas usando ataques de força bruta ou de dicionário (aumentado), comparar bancos de dados ou tentar encontrar hashes de senhas nas chamadas tabelas arco-íris. Se uma correspondência for encontrada, é computacionalmente certo que a entrada foi encontrada. As funções de hash também são seguras contra ataques de colisão: encontrar de X'
forma H(X') = H(X)
determinada H(X)
. Portanto, se um X
for encontrado, é computacionalmente certo de que foi realmente a mensagem de entrada. Caso contrário, você teria realizado um ataque de colisão, afinal. As tabelas Rainbow podem ser usadas para acelerar os ataques e existem recursos especializados da Internet que o ajudarão a encontrar uma senha com um hash específico.
Obviamente, é possível reutilizar o valor de hashH(X)
para verificar senhas que foram geradas em outros sistemas. A única coisa que o sistema receptor precisa fazer é armazenar o resultado de uma função determinística F
que recebe H(X)
como entrada. Quando X
é fornecido ao sistema H(X)
, F
pode ser recalculado e, portanto, comparado com os resultados. Em outras palavras, não é necessário descriptografar o valor do hash para apenas verificar se uma senha está correta e você ainda pode armazenar o hash como um valor diferente.
Em vez do MD5, é importante usar um hash de senha ou PBKDF (função de derivação de chave baseada em senha). Essa função especifica como usar um sal junto com um hash. Dessa forma, hashes idênticos não serão gerados para senhas idênticas (de outros usuários ou dentro de outros bancos de dados). Os hashes de senha por esse motivo também não permitem o uso de tabelas arco-íris, desde que o sal seja grande o suficiente e seja randomizado adequadamente.
Os hashes de senha também contêm um fator de trabalho (às vezes configurado usando uma contagem de iterações ) que pode desacelerar significativamente os ataques que tentam encontrar a senha com base no valor de sal e hash. Isso é importante, pois o banco de dados com sais e valores de hash pode ser roubado. Finalmente, o hash da senha também pode ter memória insuficiente, de modo que uma quantidade significativa de memória é necessária para calcular o hash. Isso torna impossível o uso de hardware especial (GPU, ASIC, FPGA etc.) para permitir que um invasor acelere a pesquisa. Outras entradas ou opções de configuração, como uma pimenta ou a quantidade de paralelismo, também podem estar disponíveis para um hash de senha.
No entanto, ainda permitirá que alguém verifique uma senha fornecida, H(X)
mesmo que H(X)
seja um hash de senha. Os hashes de senha ainda são determinísticos; portanto, se alguém souber toda a entrada e o próprio algoritmo de hash, X
poderá ser usado para calcular H(X)
e - novamente - os resultados poderão ser comparados.
Os hashes de senha comumente usados são bcrypt , scrypt e PBKDF2 . Também existe o Argon2 de várias formas, vencedor da competição razoavelmente recente de hash de senhas. Aqui no CrackStation há um bom post sobre como fazer a segurança da senha corretamente.
É possível impossibilitar que os adversários executem o cálculo de hash, verifique se a senha está correta. Para isso, uma pimenta pode ser usada como entrada no hash da senha. Como alternativa, é claro que o valor do hash pode ser criptografado usando uma cifra como AES e um modo de operação como CBC ou GCM. No entanto, isso requer o armazenamento de um segredo / chave de forma independente e com requisitos de acesso mais altos que o hash da senha.