Hibernate Verschlüsselung der Datenbank vollständig transparent Anwendung

8

Ich arbeite an einem Grails 1.0.4-Projekt, das in weniger als zwei Wochen veröffentlicht werden muss, und der Kunde hat gerade eine Anforderung aufgestellt, dass alle Daten in der Datenbank verschlüsselt werden sollten.

Da die Verschlüsselung jedes Datenbankzugriffs in der Anwendung selbst viel Zeit in Anspruch nehmen kann und fehleranfällig ist, ist die Lösung, die ich suche, eine für die Anwendung transparente Verschlüsselung.

Gibt es eine Möglichkeit, Hibernate einzurichten, um alle Daten in allen Tabellen zu verschlüsseln (außer maybie die ID- und Versionsspalten) oder sollte ich eine MySQL-Lösung suchen (wir verwenden MySQL 5.0)?

BEARBEITEN: Danke für all Ihre Posts für alternative Lösungen, wenn der Kunde sich ändert, wäre es großartig. Im Moment ist die Anforderung "Kein einfacher Text in der Datenbank".

Zweitens möchte ich darauf hinweisen, dass ich Grails benutze, für diejenigen, die damit nicht vertraut sind. Es ist eine Konvention über die Konfiguration, so dass selbst kleine Änderungen an der Anwendung, die nicht konventionell sind, vermieden werden sollten / p>     

Azder 28.09.2009, 14:44
quelle

7 Antworten

2

Nun, es ist lange her, seit ich die Frage gestellt habe. In der Zwischenzeit, danke für alle Antworten. Sie waren großartig, wenn es um die ursprüngliche Idee ging, die gesamte Datenbank zu verschlüsseln, aber die Anforderung änderte sich dahingehend, dass nur sensible Benutzerinformationen wie Name und Adresse verschlüsselt wurden. Also war die Lösung so etwas wie der Code unten.

Wir haben einen Verschlüssler implementiert, der die Verschlüsselungsmethode aus dem Datensatz liest (so dass es unterschiedliche Verschlüsselung pro Datensatz geben kann) und transiente doppelte Felder mit denen verbindet, die in der Datenbank verschlüsselt sind. Die zusätzlichen Bonus / Nachteile sind:

  • Die Daten werden auch im Speicher verschlüsselt, so dass jeder Zugriff auf die Methode getFirstName die Daten entschlüsselt (ich denke, es gibt eine Möglichkeit, entschlüsselte Daten zwischenzuspeichern, aber ich brauche sie in diesem Fall nicht)
  • Verschlüsselte Felder können nicht mit Standard-Grails / Hibernate-Methoden für die Datenbanksuche verwendet werden. Wir haben benutzerdefinierte Methoden in Diensten erstellt, die Daten abrufen, verschlüsseln und dann die verschlüsselten Daten in der where-Klausel einer Abfrage verwenden. Es ist einfach, wenn Sie User.withCriteria

    verwenden

    class Benutzer {

    %Vor%

    }

Azder 30.01.2010, 15:10
quelle
5

Wenn Sie die Arbeit in der Anwendung beenden, können Sie benutzerdefinierte Hibernate-Typen verwenden, und der Code wird nicht um so viele Änderungen hinzugefügt.

Hier ist ein verschlüsselter String-Typ, den ich verwendet habe:

%Vor%

und basierend darauf sollte es einfach sein, ähnliche Klassen für int, long usw. zu erstellen. Um sie zu verwenden, fügen Sie den Typ zum Mapping-Closing hinzu:

%Vor%

Ich habe die Methoden CryptoUtils.encrypt () und CryptoUtils.decrypt () weggelassen, da das nicht Grails-spezifisch ist. Wir verwenden AES, z.B. "Cipher cipher = Cipher.getInstance ('AES / CBC / PKCS5Padding')". Was auch immer Sie am Ende verwenden, stellen Sie sicher, dass es eine 2-Wege-Crypto ist, d. H. Verwenden Sie nicht SHA-256.

    
Burt Beckwith 28.09.2009 15:29
quelle
4

Wenn sich der Kunde Sorgen macht, dass jemand mit der Festplatte physisch davonläuft, sollte eine vollständige Festplattenlösung wie Truecrypt funktionieren. Wenn Sie sich Sorgen darüber machen, dass der Verkehr beschnüffelt wird, schauen Sie sich this Teil der MySQL-Dokumentation auf SSL über JDBC. Denken Sie daran, wenn jemand Ihren Server kompromittiert, sind alle Wetten ausgeschaltet.

    
Jared 28.09.2009 17:57
quelle
2

der Kunde könnte dies leicht tun, ohne etwas in Ihrer Anwendung zu ändern.

Verschlüsseln Sie zuerst die Kommunikation zwischen dem Server, indem Sie SSL in der mysql-Schicht aktivieren, oder verwenden Sie einen SSH-Tunnel.

Zweitens, speichern Sie die MySQL-Datenbank auf einem verschlüsselten Volume.

jeder Angriff, der das Dateisystem der mysql-Datenbank oder die Anmeldeinformationen für den mysql-Server offenlegen kann, wird nicht durch die Verschlüsselung der Daten gemildert, da mit demselben Angriff der Verschlüsselungsschlüssel von der Anwendung selbst abgerufen werden kann / p>     

longneck 28.09.2009 16:03
quelle
1

Eine andere Option besteht darin, einen JDBC-Treiber zu verwenden, der Daten während des Betriebs in zwei Richtungen verschlüsselt / entschlüsselt. Beachten Sie, dass jede Lösung wahrscheinlich Suchvorgänge durch verschlüsselte Felder ungültig macht.

IMHO die beste Lösung ist die von longneck vorgeschlagen, wird es alles viel einfacher machen, von der Verwaltung bis zur Entwicklung. Bedenken Sie außerdem, dass jede Lösung mit clientseitiger Verschlüsselung alle Ihre db-Daten außerhalb des Clients unbrauchbar macht, dh Sie werden nicht in der Lage sein, nette Tools wie einen jdbc-Client oder einen MySQL-Query-Browser zu verwenden, usw.

>     
Miguel Ping 28.09.2009 17:38
quelle
1

Jasypt integriert sich in Hibernate: Ссылка . Abfragen, die WHERE-Klauseln verwenden, können jedoch nicht verwendet werden

    
Roshan Shrestha 05.10.2009 17:24
quelle
0

Generierte IDs, Version, zugeordnete Fremdschlüssel - im Grunde alles, was von Hibernate verwaltet wird - sind deaktiviert, es sei denn, Sie möchten benutzerdefinierte CRUD für alle Ihre Klassen deklarieren und sie manuell in Abfragen verschlüsseln.

Für alles andere hast du eine Auswahl:

  1. @PostLoad und @PrePersist Entity-Listener werden darauf achten aller Nicht-Abfrage-Operationen.
  2. Die Implementierung benutzerdefinierter String / Long / Integer / etc ... -Typen für die Verschlüsselung wird sowohl für Abfrage- als auch für CRUD-Operationen sorgen. das Mapping wird jedoch ziemlich unordentlich.
  3. Sie können einen dünnen Wrapper um einen JDBC-Treiber (sowie Connection / Statement / PreparedStatement / ResultSet / etc ...) schreiben, um die Verschlüsselung für Sie zu übernehmen.

Was Abfragen betrifft, müssen Sie die Verschlüsselung manuell handhaben (es sei denn, Sie gehen mit Nummer 2 weiter oben), aber Sie sollten dies über einen einzigen Einstiegspunkt tun können. Ich bin mir nicht sicher, wie (oder ob) Grails damit umgeht, aber mit Spring zum Beispiel wäre es so einfach wie das Erweitern von HibernateTemplate.

    
ChssPly76 28.09.2009 15:13
quelle