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>
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:
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
verwendenclass Benutzer {
%Vor%}
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.
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
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>
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.
>Jasypt integriert sich in Hibernate: Ссылка . Abfragen, die WHERE-Klauseln verwenden, können jedoch nicht verwendet werden
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:
@PostLoad
und @PrePersist
Entity-Listener werden darauf achten aller Nicht-Abfrage-Operationen. 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.
Tags und Links mysql database hibernate grails encryption