Verschlüsselte Spalten mit Entity Framework

8

Wer hat einen guten Weg gefunden, verschlüsselte Werte von db durch Entity Framework 4 zu ziehen?

Ich habe eine MySql db mit einigen Spalten, die mit des_encrypt verschlüsselt sind, und ich muss in der Lage sein, diese Werte so einfach wie möglich zu bekommen und sie natürlich auch zu aktualisieren und einzufügen.

Ich denke, es ist ziemlich seltsam, dass es dafür in EF keine eingebaute Unterstützung gibt. Auch unser eigenes ORM-System unterstützt dies. Wir fügen nur einen Kommentar "verschlüsselt" für jedes Feld hinzu, das verschlüsselt ist, und das ORM-Tool fügt des_decrypt (Spalte) und des_encrypt (Spalte) in die Abfragen ein.

Jeder?

    
Andreas 21.07.2010, 12:16
quelle

5 Antworten

2

IMO sollten Sie verschlüsseln bevor Sie es in die Datenbank einfügen und als Binärdaten speichern. Dann kannst du das byte[] mit EF leicht erhalten.

BEARBEITEN: Was ist, wenn Sie eine gespeicherte Prozedur verwendet haben, um alle des_encrypt und des_decrypt sowie selects/inserts/deletes für Sie auszuführen. Dann macht EF noch das Mapping für Sie?

    
TheCloudlessSky 21.07.2010, 13:19
quelle
13

Dies ist ein Implementierungsbeispiel der von @TheCloudlessSky vorgeschlagenen Antwort. Ich dachte, es würde jedem helfen, der sich fragte, wie man es umsetzen könnte.

Ich habe mit einer vorhandenen Datenbank gearbeitet, sodass die Basismodellklasse automatisch für mich generiert wurde.

Automatisch generierte Benutzer.cs:

%Vor%

Ich habe meine eigene User.cs erstellt. (Beachten Sie, dass es sich im selben Namespace wie die automatisch generierte User.cs befindet und keine Compilerfehler aufgetreten sind, da die automatisch generierte User.cs als partielle Klasse deklariert wurde! Auch meine eigene User.cs kann nicht sein im selben Ordner wie automatisch generierte User.cs wegen Dateinamenskonflikt!)

%Vor%

Jetzt, wenn ich Benutzer von meinem DbContext abrufen wollte, sehe ich alle Eigenschaften, die in der automatisch generierten Klasse definiert sind, sowie die, die in meiner erweiterten Klasse definiert sind.

Hier ist eine Implementierung meines UserRepository.cs:

%Vor%

Jetzt fragen Sie sich vielleicht, wie / woher habe ich MyDbContext.Decrypt () erhalten?

Dies wird NICHT automatisch für Sie generiert. Sie können diese gespeicherte Prozedur jedoch in Ihre automatisch generierte Datei Model.Context.cs importieren. (Dieser Prozess ist im offiziellen Artikel von EntityFramework sehr gut dokumentiert: Gewusst wie: Importieren einer gespeicherten Prozedur (Entity Data Model Tools) unter Ссылка )

Nur für den Fall, dass Sie nicht wissen, wie das Endergebnis aussehen soll, hier ist was automatisch in meinem Model.Context.cs generiert wurde:

%Vor%

So sieht meine Decrypt Stored Procedure aus:

%Vor%

Überlegungen zur Leistung

Nun, da ich Ihnen eine Implementierung der Antwort von @TheCloudlessSky gezeigt habe, möchte ich schnell einige leistungsbezogene Punkte hervorheben.

1) Jedes Mal, wenn Sie ein Benutzerobjekt abrufen, werden 2 Fahrten zur Datenbank statt 1 durchgeführt. Erste Fahrt zum Abrufen des Objekts; zweite Reise zum Entschlüsseln von SSN. Dies kann zu Leistungsproblemen führen, wenn Sie nicht vorsichtig sind.

Empfehlung : Verschlüsselte Felder NICHT automatisch entschlüsseln! In meinem oben gezeigten Beispiel entschlüsselte ich SSN beim Abrufen des Benutzerobjekts. Ich tat das nur zu Demonstrationszwecken! Fragen Sie sich, ob Sie SSN wirklich jedes Mal benötigen, wenn der Benutzer abgerufen wird. Wenn möglich, wählen Sie faule Entschlüsselung über eifrige Entschlüsselung!

2) Obwohl ich dies nicht demonstriert habe, werden jedes Mal, wenn Sie ein Benutzerobjekt erstellen / aktualisieren, auch zwei Fahrten zur Datenbank durchgeführt. Erste Reise zur Verschlüsselung von SSN; zweite Fahrt zum Einfügen eines Objekts. Auch dies kann zu Leistungsproblemen führen, wenn Sie nicht vorsichtig sind.

Empfehlung : Seien Sie sich über diesen Leistungseinbruch bewusst, delegieren Sie jedoch nicht das Verschlüsseln und Speichern von SSN als eine andere Methode. Behalten Sie alles in einem Vorgang, sonst vergessen Sie vielleicht, es vollständig zu speichern. Daher ist die Empfehlung zum Erstellen / Aktualisieren das Gegenteil des Abrufens: Wählen Sie eine Eager-Verschlüsselung gegenüber einer Lazy-Verschlüsselung!

    
Parth Shah 03.09.2014 04:04
quelle
1

Sie können die AES-Verschlüsselung (2-Wege-Verschlüsselung) verwenden. Wenn Sie die Datenbank abfragen müssen, können Sie die verschlüsselte Zeichenfolge senden, die den Zielwert darstellen kann.

Sie können eine Erweiterung erstellen, um die Entität zu entschlüsseln.

%Vor%

Dies kann eine Datenbankabfrage durchführen.

Achten Sie auf die Datengröße, verschlüsselte Daten sind größer ...

    
EliorCohen 24.05.2012 16:45
quelle
1

Sie könnten die DIY / Roll-eigene Verschlüsselungssicherheit wählen, aber jeder Sicherheitsexperte wird Ihnen sagen, niemals, niemals . Der schwierigste Teil der Datensicherheit und Verschlüsselung ist eigentlich kein "AES" oder irgendein Algorithmus. Es ist Schlüsselmanagement. Früher oder später wirst du diesem Biest gegenübertreten und es ist schwieriger.

Glücklicherweise gibt es ein Tool namens Crypteron CipherDb , das dafür sorgt. In der Tat geht es über die Entities Framework-Verschlüsselung hinaus und bietet außerdem automatischen Manipulationsschutz, sicheren Schlüsselspeicher, sichere Schlüsselverteilung, Schlüsselübergaben, Schlüssel-Caching, Zugriffskontrolllisten und mehr. Es gibt eine kostenlose Community-Edition und es dauert nur ein paar Minuten, um sie deiner App hinzuzufügen.

Bei der Integration in Entity Framework müssen Sie nur das Datenmodell mit [Secure] annotieren oder eine Eigenschaft für etwas wie Secure_SocialSecurityNumber (das Secure_ ist das Schlüsselteil) und CipherDb kümmert sich um den Rest.

Ihr Datenmodell wäre beispielsweise:

%Vor%

Und Ihre web.config wäre

%Vor%

Es wird empfohlen, Ihre web.config zu sichern oder den Crypteron-API-Schlüssel (AppSecret) programmatisch zu installieren ( Dokumentation ) )

Sie finden die Beispiel-Apps auf GitHub unter Ссылка . .

Übrigens profitiert die kostenlose Ausgabe von den kommerziellen Angeboten, so dass Sie zusätzlich Streams, Dateien, Objekte, Nachrichtenwarteschlangen, NoSQL-Datenbanken usw. von einem Ort aus sichern können.

Haftungsausschluss : Ich arbeite dort und wir haben eine kostenlose Community Edition, die jeder nutzen kann (und wir machen kein Geld daraus). Wenn Sie denken, dass es cool ist, erzählen Sie es uns, erzählen Sie es Ihren Freunden. Wenn Sie ein Budget haben, erhalten Sie eine kommerzielle Lizenz. Es hilft uns, die kostenlose Ausgabe jedem anzubieten:)

    
DeepSpace101 21.03.2017 00:28
quelle
-3

In meinem speziellen Fall musste ich eine Kreditkartennummer verschlüsseln, die immer 16 Zeichen lang ist; also habe ich gerade eine Bedingung in den get (wenn länge! = 16 dann entschlüsseln) und in die Menge (falls length == 16 dann verschlüsseln) der Eigenschaft eingefügt. Es funktioniert und vermied mir viel Arbeit.

    
Carlos 07.12.2012 17:06
quelle