Gostaria de saber se o Password Hasher, que é o padrão implementado no UserManager que acompanha o MVC 5 e o ASP.NET Identity Framework, é seguro o suficiente? E se sim, se você pudesse me explicar como isso funciona?
A interface IPasswordHasher tem esta aparência:
public interface IPasswordHasher
{
string HashPassword(string password);
PasswordVerificationResult VerifyHashedPassword(string hashedPassword,
string providedPassword);
}
Como você pode ver, ele não precisa de muito sal, mas é mencionado neste tópico: " Hash de senha de identidade do Asp.net ", que realmente o sal nos bastidores. Então, eu estou querendo saber como isso faz isso? E de onde vem esse sal?
Minha preocupação é que o sal seja estático, tornando-o bastante inseguro.
securiry.stackexchange.com
. E obrigado pela dica!Respostas:
Aqui está como a implementação padrão ( ASP.NET Framework ou ASP.NET Core ) funciona. Ele usa uma Função de Derivação de Chave com sal aleatório para produzir o hash. O sal é incluído como parte da produção do KDF. Assim, cada vez que você "hash" a mesma senha, você obterá hashes diferentes. Para verificar o hash, a saída é dividida novamente no salt e no restante, e o KDF é executado novamente na senha com o salt especificado. Se o resultado corresponder ao restante da saída inicial, o hash será verificado.
Hashing:
Verificando:
fonte
HashPassword
função retorna os dois na mesma string? E quando você o verifica, o divide novamente e faz o hash da senha de texto não criptografado, com o sal da divisão, e a compara com o hash original?var hashedPassword = HashPassword(password); var result = VerifyHashedPassword(hashedPassword, password);
- é o que você precisa fazer. depois dissoresult
contém true.Como atualmente o ASP.NET é de código aberto, você pode encontrá-lo no GitHub: AspNet.Identity 3.0 e AspNet.Identity 2.0 .
Dos comentários:
fonte
Entendo a resposta aceita e a votei de forma positiva, mas pensei em dar uma resposta aqui para a resposta dos meus leigos ...
Criando um hash
Verificando uma senha contra um hash
Para verificar uma senha inserida por um usuário.
The Hash
Nos bastidores, o hash é gerado usando a função de hash SHA1 ( https://en.wikipedia.org/wiki/SHA-1 ). Essa função é chamada iterativamente 1000 vezes (na implementação de identidade padrão)
Por que isso é seguro
fonte
Para aqueles como eu que são novatos nisso, aqui está o código com const e uma maneira real de comparar os bytes []. Eu recebi todo esse código do stackoverflow, mas defini consts para que os valores pudessem ser alterados e também
No ApplicationUserManager personalizado, você define a propriedade PasswordHasher como o nome da classe que contém o código acima.
fonte
_passwordHashBytes = bytes.GetBytes(SaltByteSize);
Eu acho que você quis dizer isso_passwordHashBytes = bytes.GetBytes(HashByteSize);
.. não importa em seu cenário uma vez que ambos são do mesmo tamanho, mas em geral ..