2012-09-25 11 views
6

Welchen Weg würden Sie vorschlagen, um einen sicheren Passwort-Reset-Link in MVC und C# zu erstellen? Ich meine, ich werde einen zufälligen Token erstellen, richtig? Wie kodiere ich es vor dem Senden an den Benutzer? Ist MD5 gut genug? Kennen Sie einen anderen sicheren Weg?Wie erstelle ich einen Link zum Zurücksetzen des Passworts?

+0

Die meisten Verschlüsselungsbibliotheken haben Tools zum Erzeugen einer kryptografisch Zufallszahl eingeben können. Sie müssen nichts hasch-, kodieren oder verschlüsseln. Sie brauchen nur eine zufällige Zufallszahl, die die 'Random' Klasse bieten kann. – Servy

Antwort

2

Ich glaube nicht, dass Sie eine verschlüsselte Zeichenfolge für diesen Zweck benötigen. Ich denke, eine Zeichenfolge mit Guid erstellen würde ausreichen.

string thatString=Guid.NewGuid("n").ToString(); 

Speichern Sie das in Ihrer db-Tabelle für dieses bestimmte Benutzerkonto. Erstellen Sie eine Verknüpfung für den Benutzer, der diese Zeichenfolge hat, und senden Sie sie an sie. Wenn sie darauf klicken, werden sie zu einer Aktionsmethode geführt, und Sie erhalten den entsprechenden Benutzerdatensatz, der dieser gespeicherten temporären Zeichenfolge zugeordnet ist, und zeigen das Formular an, damit der Benutzer das Kennwort aktualisieren kann.

Und wenn Sie Zweifel haben, ob Guids sind einzigartig, Kasse this.

+10

Eindeutig! = Zufällig. [GUIDs sind nicht dafür gedacht, zufällig zu sein.] (Http://blogs.msdn.com/b/ericlippert/archive/2012/05/07/guid-guide-part-three.aspx) Sie sind nicht entworfen, um unvorhersehbar zu sein . Sie sind einfach entworfen, um nicht zu wiederholen. – Servy

+0

Ich benutze diesen Ansatz auch, die Guid.Wenn Sie mit der Eindeutigkeit behaftet sind, können Sie überprüfen, ob sie bereits in der Datenbank vorhanden ist. Ich habe auch ein Timelimit gesetzt (so dass der Link nur für zwei Stunden klickbar ist), so dass die Chance auf Kollisionen noch mehr begrenzt wird. – Michel

15

Verwenden Sie System.Security.Cryptography.RandomNumberGenerator, das ist ein kryptografisch sicherer RNG. Fügen Sie das einfach in die E-Mail ein und speichern Sie es später in Ihrer Datenbank. Ich sehe keinen Sinn darin, es zu hashen.

Es ist hier dokumentiert: 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

Besser als eine Zufallszahl ist auf Salz dann Hash. Hier ist ein Ausschnitt aus einem Sicherheits Guru:

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

Sie mehr auf seine Antwort hier sehen können: https://stackoverflow.com/a/2138588/1026459

Im Grunde nur ein Passwort erstellen. Salt und hash es hier und vergleichen Sie es dann, wenn der Benutzer zurückkehrt. Die verknüpfte Antwort enthält auch eine Vergleichsmethode und eine detailliertere Erklärung von Salz/Hashing.

1

Eigentlich würde ich keine von diesen tun.

Ich konfrontiert das gleiche Problem, und ich beschloss, ein Reset-Token zu senden, und dazu verwendete ich ein JWT-Token.

Auf diesem Token (das verschlüsselt ist) können Sie einen Ablauf festlegen. Erstellen Sie einfach ein Reset-Token mit der E-Mail-Adresse des Kunden als Anspruch und legen Sie dann Ihren Ablauf fest, speichern Sie diesen in Ihrer Datenbank (in seiner verschlüsselten Form) und kodieren Sie ihn und platzieren Sie ihn als URL-Parameter auf dem Link.

Dann, wenn Sie die Anfrage erhalten, können Sie überprüfen, ob das Token gültig ist. Sie können es dann entpacken, die E-Mail-Adresse ansehen und dann fortfahren, sie zu Ihrem sicheren Passwort-Reset-Bereich für ihr Konto zu leiten. (Sie können andere Ansprüche wie Benutzername usw. hinzufügen).

Um die JWT zu erhalten implemnetation Sie Install-Package JWT

+0

Was machen Sie mit dem Debuggen dieses Tokens? Es ist möglich, alle Informationen in dieser Art von Token zu extrahieren: E-Mail, Ablaufdatum ... –