Który sposób sugerowałbyś utworzyć bezpieczne link resetowania hasła w MVC
i C#
? Mam na myśli, że utworzę losowy token , prawda? Jak mogę ją zakodować przed wysłaniem do użytkownika? Czy MD5 jest wystarczająco dobry? Czy znasz inny bezpieczny sposób?Jak utworzyć link resetowania hasła?
Odpowiedz
Nie sądzę, że potrzebujesz do tego celu zaszyfrowanego napisu. Myślę, że wystarczyłoby utworzenie jednego ciągu znaków z Guid.
string thatString=Guid.NewGuid("n").ToString();
Zapisz to w tabeli db na tym konkretnym koncie użytkownika. Utwórz łącze dla użytkownika, który ma ten ciąg i wyślij go do niego. Kiedy go klikną, przeniesie je do metody akcji, a otrzymasz odpowiedni rekord użytkownika powiązany z tym tymczasowym łańcuchem, który zapisaliśmy, i pokazujemy formularz, aby użytkownik mógł zaktualizować hasło.
A jeśli masz wątpliwości, czy Guid jest wyjątkowy, złóż zamówienie this.
Unikatowy! = Losowy. [Identyfikatory GUID nie są zaprojektowane jako losowe.] (Http://blogs.msdn.com/b/ericlippert/archive/2012/05/07/guid-guide-part-three.aspx) Nie są zaprojektowane tak, aby były nieprzewidywalne . Są po prostu zaprojektowane, aby się nie powtarzać. – Servy
Używam również tego podejścia, Guid.Jeśli niepokoi Cię wyjątkowość, możesz sprawdzić, czy istnieje już w bazie danych. Ustawiłem także na nim ograniczenie czasowe (więc link można klikać tylko przez dwie godziny), co jeszcze bardziej ogranicza ryzyko kolizji. – Michel
Użyj System.Security.Cryptography.RandomNumberGenerator
, który jest bezpiecznym kryptograficznie RNG. Wystarczy uwzględnić to w e-mailu, a następnie przechowywać go w bazie danych do późniejszego pobrania. Nie widzę sensu w haszowaniu tego.
Jest udokumentowane tutaj: http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator.aspx
using System.Security.Cryptography;
using(RandomNumberGenerator rng = new RandomNumberGenerator()) {
Byte[] bytes = new Byte[8];
rng.GetBytes(bytes);
String sendThisInEmailAndStoreInDB = Convert.ToBase64String(bytes);
}
Lepsze niż przy użyciu liczb losowych jest solą następnie hash. Oto urywek z guru bezpieczeństwa:
@using System.Security.Cryptography;
static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
{
HashAlgorithm algorithm = new SHA256Managed();
byte[] plainTextWithSaltBytes =
new byte[plainText.Length + salt.Length];
for (int i = 0; i < plainText.Length; i++)
{
plainTextWithSaltBytes[i] = plainText[i];
}
for (int i = 0; i < salt.Length; i++)
{
plainTextWithSaltBytes[plainText.Length + i] = salt[i];
}
return algorithm.ComputeHash(plainTextWithSaltBytes);
}
można zobaczyć więcej na jego odpowiedź tutaj: https://stackoverflow.com/a/2138588/1026459
Zasadniczo wystarczy utworzyć hasło. Sól i włącz ją tutaj, a następnie porównaj ją, gdy użytkownik wróci. Połączona odpowiedź zawiera także metodę porównania i bardziej szczegółowe wyjaśnienie soli/skrótu.
Właściwie nie zrobiłbym żadnej z tych rzeczy.
Zmierzyłem się z tym samym problemem i postanowiłem wysłać token resetowania, a do tego użyłem tokena JWT.
Na tym tokenie (który jest zaszyfrowany) można ustawić datę wygaśnięcia. Po prostu utwórz resetowany token zawierający adres e-mail klienta jako roszczenie, a następnie ustaw wygasanie, przechowuj go w swojej bazie danych (w zaszyfrowanej formie) i zakoduj i umieść w linku jako parametr adresu URL.
Następnie, po otrzymaniu wniosku, można sprawdzić, czy token jest ważny. Następnie można rozpakować, spojrzeć na adres e-mail, a następnie przejść do bezpiecznego obszaru resetowania hasła dla swojego konta. (możesz dołączyć inne roszczenia, takie jak nazwa użytkownika itp.).
Aby uzyskać JWT implemnetation można wpisać Install-Package JWT
co zrobisz z debugowaniem tego tokena? możliwe jest wyodrębnienie wszystkich informacji w tego rodzaju tokenie: e-mail, data ważności ... –
Większość bibliotek kryptograficznych posiada narzędzia do generowania kryptograficznie liczbę losową. Nie musisz mieszać, kodować ani szyfrować niczego. Po prostu potrzebujesz losowej liczby losowej, którą może dostarczyć klasa 'Random'. – Servy