Je me demande si le Password Hasher qui est implémenté par défaut dans le UserManager fourni avec MVC 5 et ASP.NET Identity Framework est suffisamment sécurisé? Et si oui, pouvez-vous m'expliquer comment cela fonctionne?
L'interface IPasswordHasher ressemble à ceci:
public interface IPasswordHasher
{
string HashPassword(string password);
PasswordVerificationResult VerifyHashedPassword(string hashedPassword,
string providedPassword);
}
Comme vous pouvez le voir, cela ne prend pas un sel, mais il est mentionné dans ce fil: " Asp.net Identity password hashing " qu'il le salit en fait dans les coulisses. Alors je me demande comment cela fait-il? Et d'où vient ce sel?
Ma préoccupation est que le sel est statique, ce qui le rend assez peu sûr.
securiry.stackexchange.com
. Et merci pour la pointe!Réponses:
Voici comment fonctionne l'implémentation par défaut ( ASP.NET Framework ou ASP.NET Core ). Il utilise une fonction de dérivation de clé avec un sel aléatoire pour produire le hachage. Le sel est inclus dans la sortie du KDF. Ainsi, chaque fois que vous "hachez" le même mot de passe, vous obtiendrez différents hachages. Pour vérifier le hachage, la sortie est répartie entre le sel et le reste, et le KDF est à nouveau exécuté sur le mot de passe avec le sel spécifié. Si le résultat correspond au reste de la sortie initiale, le hachage est vérifié.
Hashing:
Vérification:
la source
HashPassword
fonction renvoie les deux dans la même chaîne? Et quand vous le vérifiez, il le divise à nouveau, et hache le mot de passe en clair entrant, avec le sel de la division, et le compare avec le hachage d'origine?var hashedPassword = HashPassword(password); var result = VerifyHashedPassword(hashedPassword, password);
- c'est ce que vous devez faire. après celaresult
contient vrai.Parce que ces jours-ci, ASP.NET est open source, vous pouvez le trouver sur GitHub: AspNet.Identity 3.0 et AspNet.Identity 2.0 .
D'après les commentaires:
la source
Je comprends la réponse acceptée et je l'ai votée à la hausse, mais j'ai pensé que je laisserais la réponse de mes profanes ici ...
Créer un hachage
Vérification d'un mot de passe par rapport à un hachage
Pour vérifier un mot de passe saisi par un utilisateur.
Le hachage
Sous les couvertures, le hachage est généré à l'aide de la fonction de hachage SHA1 ( https://en.wikipedia.org/wiki/SHA-1 ). Cette fonction est appelée de manière itérative 1000 fois (dans l'implémentation d'identité par défaut)
Pourquoi est-ce sécurisé
la source
Pour ceux comme moi qui sont tout nouveaux dans ce domaine, voici le code avec const et un moyen réel de comparer les octets []. J'ai obtenu tout ce code de stackoverflow mais j'ai défini des consts pour que les valeurs puissent être modifiées et aussi
Dans votre ApplicationUserManager personnalisé, vous définissez la propriété PasswordHasher le nom de la classe qui contient le code ci-dessus.
la source
_passwordHashBytes = bytes.GetBytes(SaltByteSize);
Je suppose que vous vouliez dire ceci_passwordHashBytes = bytes.GetBytes(HashByteSize);
.. Peu importe dans votre scénario puisque les deux sont de la même taille mais en général ..