Zastanawiam się, czy funkcja Password Hasher, która jest domyślnie zaimplementowana w UserManager, która jest dostarczana z MVC 5 i ASP.NET Identity Framework, jest wystarczająco bezpieczna? A jeśli tak, czy mógłbyś mi wyjaśnić, jak to działa?
Interfejs IPasswordHasher wygląda następująco:
public interface IPasswordHasher
{
string HashPassword(string password);
PasswordVerificationResult VerifyHashedPassword(string hashedPassword,
string providedPassword);
}
Jak widać, nie wymaga soli, ale jest wspomniane w tym wątku: „ Haszowanie hasła tożsamości Asp.net ”, że faktycznie zasypia go za kulisami. Więc zastanawiam się, jak to robi? A skąd ta sól?
Martwię się, że sól jest statyczna, przez co jest dość niepewna.
securiry.stackexchange.com
. Dzięki za cynk!Odpowiedzi:
Oto jak działa domyślna implementacja ( ASP.NET Framework lub ASP.NET Core ). Wykorzystuje kluczową funkcję pochodną z losową solą do wytworzenia skrótu. Sól jest częścią produkcji KDF. Dlatego za każdym razem, gdy „haszujesz” to samo hasło, otrzymasz różne skróty. Aby zweryfikować hash, dane wyjściowe są dzielone z powrotem na sól i resztę, a KDF jest ponownie uruchamiany na haśle z określoną solą. Jeśli wynik pasuje do reszty początkowego wyjścia, skrót jest weryfikowany.
Haszowanie:
Weryfikacja:
źródło
HashPassword
funkcja zwraca oba w tym samym ciągu? A kiedy to zweryfikujesz, ponownie je dzieli i haszuje przychodzące hasło w postaci zwykłego tekstu z solą z podziału i porównuje je z oryginalnym hashem?var hashedPassword = HashPassword(password); var result = VerifyHashedPassword(hashedPassword, password);
- to, co musisz zrobić. po tymresult
zawiera true.Ponieważ obecnie ASP.NET jest oprogramowaniem typu open source, można go znaleźć w serwisie GitHub: AspNet.Identity 3.0 i AspNet.Identity 2.0 .
Z komentarzy:
źródło
Rozumiem zaakceptowaną odpowiedź i zagłosowałem za nią, ale pomyślałem, że zostawię tutaj odpowiedź moich laików ...
Tworzenie skrótu
Sprawdzanie hasła na podstawie skrótu
Aby sprawdzić hasło wprowadzone przez użytkownika.
Hash
Pod okładkami hash jest generowany za pomocą funkcji skrótu SHA1 ( https://en.wikipedia.org/wiki/SHA-1 ). Ta funkcja jest iteracyjnie nazywana 1000 razy (w domyślnej implementacji tożsamości)
Dlaczego jest to bezpieczne
źródło
Dla takich jak ja, którzy są zupełnie nowicjuszami, oto kod ze stałą i rzeczywisty sposób porównywania bajtów []. Otrzymałem cały ten kod z przepełnienia stosu, ale zdefiniowałem stałe, więc wartości można zmieniać, a także
W swoim niestandardowym ApplicationUserManager ustawisz właściwość PasswordHasher nazwę klasy, która zawiera powyższy kod.
źródło
_passwordHashBytes = bytes.GetBytes(SaltByteSize);
myślę, że miałeś to na myśli_passwordHashBytes = bytes.GetBytes(HashByteSize);
… Nie ma to znaczenia w twoim scenariuszu, ponieważ oba są tego samego rozmiaru, ale ogólnie…