Se os usuários escolherem a mesma senha (por coincidência), então, não importa qual algoritmo de hashing você usa a mesma senha, ainda é a mesma senha.
A única maneira de contornar isso será verificar cada vez que alguém registra ou altera sua senha que a senha é verificada contra um banco de dados de senhas (baaad) ou se você usar um algoritmo de hash que não usa diferentes sais / pimentas etc para cada senha (novamente, baaad).
Por fim, e esse é um dos muitos motivos pelos quais uma política de complexidade de senha sempre deve ser necessária para que você minimize o risco potencial de pessoas criarem a mesma senha.
Ou seja. Se você não permitir que sua equipe crie senhas fáceis como "Senha1", mas exigir que elas digitem letras maiúsculas, números e símbolos, as chances de elas digitarem a mesma senha são reduzidas - não eliminadas porque alguém poderia facilmente fazer, por exemplo "Password123!".
O hashing apenas protege os dados armazenados no banco de dados porque o servidor recebe os detalhes inseridos pelo usuário - > recupera o hash, o sal (e a pimenta se ambos são usados) - > executa os detalhes inseridos e obtidos do banco de dados através do algoritmo - > se o resultado for comparado ao hash armazenado, os detalhes estão corretos e permitem que o usuário entre. Isso é apenas para verificar os detalhes - nada a ver com o que o usuário digita e escolhe a senha configurada. Sal e pimenta apenas permite que o hash não seja duplicado em outro lugar no banco de dados (ou seja, se dois hashes são idênticos, a senha será a mesma para ambas as contas - baaad).
Como outras respostas já disseram, a melhor solução é a autenticação de vários fatores (mais de um dos seguintes, mas não mais do mesmo fator):
- Algo que você tem - > um cartão inteligente, gerador RSA, etc.
- Algo que você conhece - > A senha ou PIN
- Algo que você é - > biométrico (impressão digital, retina etc.)
Por exemplo,
- Cartão inteligente + Senha = Bom
- Gerador RSA + Senha + Impressão digital = Bom
- Senha + PIN = Ruim