Conclusão: O SHA-1 é tão seguro quanto qualquer coisa contra ataques de pré-imagem, no entanto, é fácil calcular, o que significa que é mais fácil montar um ataque de força bruta ou de dicionário. (O mesmo vale para sucessores como o SHA-256.) Dependendo das circunstâncias, uma função de hash projetada para ser computacionalmente cara (como o bcrypt) pode ser uma escolha melhor.
Algumas pessoas fazem comentários como "SHA-1 está quebrado" muito, então estou tentando entender o que exatamente isso significa. Vamos supor que eu tenho um banco de dados de hashes de senha SHA-1 e um invasor com um algoritmo de quebra de SHA-1 de ponta e um botnet com 100.000 máquinas obtém acesso a ele. (Ter controle sobre 100 mil computadores domésticos significa que eles podem realizar cerca de 10 ^ 15 operações por segundo.) Quanto tempo eles precisariam
- descobrir a senha de qualquer usuário?
- descobrir a senha de um determinado usuário?
- descobrir a senha de todos os usuários?
- encontrou uma maneira de fazer login como um dos usuários?
- encontrou uma maneira de fazer login como um usuário específico?
Como isso muda se as senhas forem salgadas? O método de salgar (prefixo, postfix, ambos ou algo mais complicado como xor-ing) é importante?
Aqui está o meu entendimento atual, depois de pesquisar no Google. Corrija as respostas se eu entendi algo errado.
- Se não houver sal, um ataque do arco-íris encontrará imediatamente todas as senhas (exceto as extremamente longas).
- Se houver um sal aleatório suficientemente longo, a maneira mais eficaz de descobrir as senhas é uma força bruta ou ataque de dicionário. Os ataques de colisão e de pré-imagem não ajudam em nada a descobrir a senha real; portanto, os ataques criptográficos contra o SHA-1 não ajudam aqui. Não importa muito qual algoritmo é usado - é possível usar o MD5 ou o MD4 e as senhas seriam igualmente seguras (há uma pequena diferença porque o cálculo de um hash SHA-1 é mais lento).
- Para avaliar o quão seguro é "tão seguro", vamos supor que uma única execução do sha1 execute 1000 operações e as senhas contenham maiúsculas, minúsculas e dígitos (ou seja, 60 caracteres). Isso significa que o invasor pode testar 10 15 * 60 * 60 * 24/1000 ~ = 10 17 possíveis senhas por dia. Para um ataque de força bruta, isso significaria testar todas as senhas com até 9 caracteres em 3 horas, até 10 caracteres em uma semana e até 11 caracteres em um ano. (Leva 60 vezes mais para cada caractere adicional.) Um ataque de dicionário é muito, muito mais rápido (mesmo um invasor com um único computador pode executá-lo em horas), mas só encontra senhas fracas.
- Para efetuar login como usuário, o invasor não precisa descobrir a senha exata; basta encontrar uma sequência que resulte no mesmo hash. Isso é chamado de primeiro ataque de pré-imagem. Tanto quanto pude encontrar, não há ataques de pré-imagem contra o SHA-1. (Um ataque de força bruta levaria 2 160 operações, o que significa que nosso atacante teórico precisaria de 10 a 30 anos para executá-lo. Os limites de possibilidade teórica são de cerca de 2 60 operações, nas quais o ataque levaria alguns anos.) Existem ataques de pré-imagem contra versões reduzidas do SHA-1 com efeito desprezível (para o SHA-1 reduzido que usa 44 etapas em vez de 80, o tempo de ataque diminuiu de 2 160 operações para 2 157) Existem ataques de colisão contra o SHA-1 que estão bem dentro das possibilidades teóricas ( o melhor que encontrei reduz o tempo de 2 80 para 2 52 ), mas esses são inúteis contra hashes de senhas, mesmo sem salga.
Em resumo, o armazenamento de senhas com o SHA-1 parece perfeitamente seguro. Perdi alguma coisa?
Atualização: Marcelo apontou um artigo que menciona um segundo ataque de pré-imagem em 2 106 operações . ( Editar: Como Thomas explica , este ataque é uma construção hipotética que não se aplica a cenários da vida real.) Ainda não vejo como isso significa perigo para o uso do SHA-1 como uma função de derivação chave. Geralmente, existem boas razões para pensar que um ataque de colisão ou um segundo ataque de pré-imagem pode eventualmente se transformar em um primeiro ataque de pré-imagem?