EF Code First-Verschlüsseln/Entschlüsseln Password-Eigenschaft
Ich habe das Modell wie folgt:
public class User
{
private string password;
public string Password
{
get { return Decrypt(password); }
set { password = Encrypt(value); }
}
}
Möchte ich vom Benutzer-code zu verwenden, legen Sie Sie einfach und wählen Sie Kennwort leicht und sehen in Klartext und wollen, dass die Logik-Schicht zu behandeln, die Verschlüsselung und die Entschlüsselung.
Aber bei der Auswahl, EF set
die value
wieder, so dass die verschlüsselte Passwort bekommen aus der Datenbank, verschlüsselt Sie wieder für mich zu bekommen, von der client-code was ist ein problem. Ich kann auch nicht unterscheiden zwischen einer Insert
und Select
zu setzen-Bedingungen.
Kann ich sehr gut tun:
//Insert
user.Password = Encrypt("123"); //Encrypt or Hash does not matter
context.Users.Add(user);
//Select
var hashedpassword = context.Users.Find(1).Select(u => u.Password).Single();
var unhashed = Decrypt(hashedpassword);
Stattdessen würde ich mag es nicht ersichtlich sein, aus dem client-code:
//Insert
user.Password = "123"; //Inserts encrypted password in database
context.Users.Add(user);
//Select
var cleartextpassword = context.Users.Find(1).Select(u => u.Password).Single();
Hoffe, ich konnte das problem erklären und jemand kann mir die richtige Richtung. Wenn es überhaupt möglich ist oder nicht.
- Irgendein besonderer Grund, die Sie nicht verwenden hashing anstatt Verschlüsselung? Warum sein Passwort Hash. Unterschied zwischen Hash ein Passwort und Verschlüsseln
- Es ist hashing und salting vorhanden, aber meine Sorge ist in Bezug auf, wie Sie hash/unhash oder verschlüsseln/entschlüsseln, ohne dass es offensichtlich von der client-code. Hoffe, ich war in der Lage zu erklären.
- Ich denke, oleksii der Punkt ist, dass Sie sollten niemals, unter keinen Umständen in der Lage sein zu entschlüsseln ein Passwort. Sobald ein Benutzer ausgewählt hat, und gespeichert, ein Passwort, es sollte für immer unlesbar. Sie sollte nur in der Lage sein zu vergleichen, einen hash, um es, zu überprüfen, sofern das Passwort nicht Lesen das gespeicherte Passwort (und wenn ein Benutzer benötigt, um ein Kennwort zu ändern, erzeugen Sie eine neue zufallsnummer für ihn).
- Es gibt keine solche Sache wie unhash. Hash ist eine verlustbehaftete one-way-Konvertierung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die bessere Lösung ist in der Tat zu verwenden, einen Hash.
Aber ein Allgemeines Muster für die Injektion eine gewisse Logik:
Statt
[NotMapped]
Sie können auch mithilfe der fluent-API zu halten, EF speichern Sie es direkt.PasswordStored
und Fragen für die migration wird, entfernen Sie die Spalte. Gibt es eine Abhilfe?public
stattprotected
, obwohl ich nicht sehen kann die genaue Ausgabe hier.private set;
scheint vernünftig, aber vielleicht, wenn es war eine elegante Art und Weise.Lesen Sie und schreiben Sie Ihre Einheiten nur aus einem repository, d.h., durch eine data-access-Klasse, die Sie schreiben:
dann Ihre
GetUserById()
Methode auszuführen, kann die Entschlüsselung in-place. Dann, wenn Siekönnen Sie verschlüsseln das Feld wieder in die
UpdateUser()
Methode.Finden folgende Methode, die erhalten Sie einen Passwort-hash: