2012-09-25 36 views
6

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?

+0

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

Odpowiedz

2

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.

+10

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

+0

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

15

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); 
} 
1

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.

1

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

+0

co zrobisz z debugowaniem tego tokena? możliwe jest wyodrębnienie wszystkich informacji w tego rodzaju tokenie: e-mail, data ważności ... –