Verschlüsselte Spalten mit Entity Framework
Jemand herausgefunden, eine gute Möglichkeit zu ziehen verschlüsselte Werte aus der Datenbank über entity framework 4?
Ich habe eine MySql-db mit einigen Spalten verschlüsselt mit des_encrypt und müssen in der Lage sein, diese Werte so einfach wie möglich, und natürlich auch, zu aktualisieren und fügen Sie Sie.
Ich denke, es ist ziemlich seltsam, es nicht zu sein scheinen in integrierten Unterstützung für dieses in EF. Auch unsere eigenen integrierten ORM-system haben die Unterstützung für diese. Wir fügen Sie einfach ein Kommentar, "verschlüsselt" wird für jedes Feld, das ist verschlüsselt und das ORM-tool hinzufügen des_decrypt(Spalte) und des_encrypt(Spalte) in den Abfragen.
Jemand?
Du musst angemeldet sein, um einen Kommentar abzugeben.
IMO sollten Sie verschlüsseln vor setzen es in die Datenbank und speichern Sie es als Binär-Daten. Dann können Sie leicht die
byte[]
mit EF.EDIT: Was ist, wenn Sie eine gespeicherte Prozedur, alles zu tun, die
des_encrypt
unddes_decrypt
sowie dieselects/inserts/deletes
für Sie. Dann EF wird noch das mapping für Sie?MemberId
verschlüsselt ist? Sollten Sie nicht nur entschlüsseln müssen Spalten, die verschlüsselt sind (wie ein Passwort... obwohl, verwenden Sie ein one-way-hash)? WennMemberId
ist nicht verschlüsselt, Sie brauchen nicht zu entschlüsseln, es zu tun Sie 'WÄHLEN'. Ist jemand anderes, die diese Tabelle verwenden? Warum gehst du nicht entschlüsseln es und erstellen Sie eine neue Tabelle für die nicht-verschlüsselten Daten?Dies ist eine Implementierung Beispiel der Antwort vorgeschlagen von @TheCloudlessSky. Ich dachte, es wird helfen, jemand, der sich fragte, wie man über die Umsetzung.
War ich mit einer vorhandenen Datenbank arbeiten, so dass die grundlegenden model-Klasse automatisch erzeugt für mich.
Automatisch generierte User.cs:
Habe ich meinen eigenen User.cs. (Hinweis: es ist in dem gleichen Namensraum wie die automatisch generierten Benutzer.cs und es gab keine compiler-Fehler, da die automatisch generierten Benutzer.cs wurde erklärt wie partielle Klasse! Auch meine eigenen User.cs kann nicht im gleichen Ordner wie die automatisch generierten Benutzer.cs, weil der Dateiname Konflikt!)
Nun, wenn ich waren auf das abrufen von Benutzer-von meinem DbContext, ich werde sehen, alle Eigenschaften definiert, die im automatisch generierten Klasse, als auch diejenigen definiert, die in meiner erweiterten Klasse.
Hier ist eine Umsetzung meines UserRepository.cs:
Jetzt können Sie sich Fragen, wie/Woher bekomme ich MyDbContext.Decrypt() aus?
Diese ist NICHT automatisch für Sie generiert. Jedoch können Sie importieren Sie diese gespeicherte Prozedur in Ihrem auto-generierte Modell.Kontext.cs-Datei. (Dieser Prozess ist sehr gut dokumentiert, die in der offiziellen EntityFramework Artikel: gewusst Wie: Importieren einer Gespeicherten Prozedur (Entity Data Model-Tools) an http://msdn.microsoft.com/en-us/library/vstudio/bb896231(v=vs. 100).aspx)
Nur für den Fall Sie nicht wissen, was Ende das Ergebnis Aussehen soll, hier ist, was wurde automatisch generiert bei meinem Modell.Kontext.cs:
Dies ist, wie mein Entschlüsseln der Gespeicherten Prozedur sieht wie folgt aus:
Performance-Überlegungen
Nun, ich habe Ihnen gezeigt, eine Umsetzung der Antwort von @TheCloudlessSky, ich mag, um schnell zu markieren Sie einige performance-bezogenen Punkte.
1) Jedes mal, wenn das abrufen eines user-Objekts gibt es 2 Ausflüge gemacht, um die Datenbank anstelle von 1. Erste Reise für das abrufen von Objekt; zweite Reise zur Entschlüsselung der SSN. Dies kann Leistungsprobleme verursachen, wenn Sie nicht vorsichtig sind.
Empfehlung: KEINE automatische entschlüsseln von verschlüsselten Felder! In meinem Beispiel oben gezeigt, entschlüsselt SSN, wenn ich war das abrufen von Benutzer-Objekt. Ich wusste, dass war nur zur demonstration! Fragen Sie sich, ob Sie wirklich brauchen, SSN jedes einzelne mal, wenn Benutzer abgerufen werden. Wenn möglich, wählen Sie faul Entschlüsselung über gespannt Entschlüsselung!
2) ich habe Zwar nicht bewiesen, dass diese, jedes einzelne mal, wenn Sie erstellen/aktualisieren eines Benutzer-Objekt gibt, wird es auch 2 Ausflüge gemacht, um die Datenbank. Erste Reise für die Verschlüsselung von SSN; zweite Reise für Objekt einfügen. Wieder dies kann Leistungsprobleme verursachen, wenn Sie nicht vorsichtig sind.
Empfehlung: das Bewusstsein über diese Leistung Treffer aber nicht delegieren, das verschlüsseln und speichern der SSN als eine andere Methode. Halten Sie das alles in einer operation sonst können Sie vergessen, es zu speichern insgesamt. Also die Empfehlung für die Erstellung/Aktualisierung ist das Gegenteil von abrufen: wählen Sie begierig Verschlüsselung über lazy-Verschlüsselung!
Können Sie die AES-Verschlüsselung (2-Weg-Verschlüsselung). Wenn Sie brauchen, um die Abfrage der db, die Sie senden können die verschlüsselte Zeichenfolge, darstellen können, ist das Ziel Wert.
Können Sie erstellen, die eine Erweiterung zum Entschlüsseln der Einheit.
Dies kann eine Datenbank-Abfrage.
Bewusst sein, die Größe der Daten, verschlüsselte Daten größer ist...
Könnten Sie auch DIY/roll-eigene Verschlüsselung, aber alle security-Experte wird Ihnen sagen,nie, nie, niemals, zu tun . Der schwierigste Teil der Daten Sicherheit und Verschlüsselung ist eigentlich nicht "AES" oder-Algorithmus. Es ist das Schlüssel-management. Früher oder später triffst du auf das Tier und es ist Weg härter.
Glücklicherweise gibt es ein Werkzeug namens Crypteron CipherDb, die das übernimmt. In der Tat geht es über entity framework-Verschlüsselung, auch die automatische tamper protection, secure key storage, secure key distribution, key-roll-overs, key caching, access-control-Listen und mehr. Es ist ein Kostenlose community edition und es dauert nur ein paar Minuten hinzufügen, um Ihre app.
Bei der Integration mit Entity Framework, die Sie gerade kommentieren das Datenmodell mit
[Secure]
Namen oder eine Eigenschaft auf etwas wieSecure_SocialSecurityNumber
(dieSecure_
ist der wichtigste Teil) und CipherDb kümmert sich um den rest.Beispielsweise Ihre Daten Modell wäre:
Und Ihr web.config wäre
Es wird empfohlen, sichern Sie sich Ihre web.config ODER stecken Sie den Crypteron API-Schlüssel (AppSecret) programmgesteuert (Dokumentation)
Finden Sie die Beispiel-apps auf GitHub an https://github.com/crypteron/crypteron-sample-apps. .
Durch die Art und Weise, die free edition profitiert von den kommerziellen angeboten, also zusätzlich zu den oben genannten, können Sie auch sicher, streams, Dateien, Objekte, message-queues, NoSQL-Datenbanken usw., die alle aus einem Ort.
Haftungsausschluss: ich arbeite dort, und wir haben eine Kostenlose community edition, die jeder benutzen kann (und wir don ' T machen kein Geld aus). Wenn Sie denken, dass es cool ist, sagen Sie uns, erzählen Sie Ihren Freunden. Wenn Sie ein budget haben, erhalten Sie eine kommerzielle Lizenz. Es hilft uns, die bieten die Kostenlose Ausgabe an alle 🙂
Für diejenigen von Euch, die man beim Googeln nach dieser Frage und der Suche nach einem einfachen Weg, um zu entschlüsseln, die eine einzelne Spalte/Zeile (nicht die gesamte Tabelle/Klasse), mithilfe der symmetrischen Verschlüsselung und EF, Sie können dies tun, eine von zwei (einfache) Wege.
Ersten Art; erstellen Sie eine gespeicherte Prozedur, die Ihre Entschlüsselung:
... dann rufen Sie die gespeicherte Prozedur direkt in den code abrufen das Ergebnis als string:
Den zweiten Weg, können Sie dies tun, ist über eine Datenbank-Transaktion, die im wesentlichen die gleiche wie die gespeicherte Prozedur. Hinweis: ich bin mir voll bewusst dieses Beispiel ist nicht sql-injection-Schutz-konform, ich hatte einige Probleme mit parametrisierten Abfragen, also dies war das Beispiel, ich habe zu arbeiten. Sie möchten der Verwendung von parametrisierten Abfragen wenn Sie diesen Weg gehen;
In meinem konkreten Fall brauchte ich zum verschlüsseln Kreditkartennummer, das ist immer 16 Zeichen; so habe ich nur noch ein Zustand, in dem man (wenn Länge != 16 dann entschlüsseln) und in der Gruppe (wenn Länge == 16 dann verschlüsseln) der Eigenschaft. Es funktioniert und es vermieden, mir eine Menge Arbeit.