Daten verschlüsseln

OnDemand

Top Contributor
Hallo zusammen,

ich muss in meiner DB Daten speichern die ich nicht gern im Klartext haben will. Ich könnte im Code was einbauen um das zu verschlüsseln, soweit so gut.

Gibt es vielleicht noch eine SQL Variante wo ich sogar nachträglich bereits abgelegte Daten verschlüsseln kann ohne, dass ich im Code was machen muss? Bin der Meinung da mal was gelesen zu haben, dass es da eine Mysql Funktion gibt, aber bin mir nicht mehr sicher und finde dazu auch nix mehr.

Edit: das hier meinte ich
INSERT INTO secrets (content) VALUES (AES_ENCRYPT('das ist mein geheimnis', 'mCgCizeXzYrXXTvxrNmrIsKO8vdaFs3ZzTo7UcQ8mr+Q/6KIpJDMdgeKH57weCqLH5vJ6aquAuI='));

AES ist jetzt nicht soooo der bringer (aber besser als Klartext) jemand ne gescheitere Idee? BTW nutzte Spring boot, vielleicht gibts da ja schon was onboard, dass man daten verschlüsselt speichert und beim select automatisch entschlüsselt
 

OnDemand

Top Contributor
Hab es jetzt so gelöst, dass die entsprechende Spalte ein LONGBLOB wird und die Attribute in der Entity wie folgt:
Java:
 @ColumnTransformer(
            read = "AES_DECRYPT(data_value, 'secret-......')",
            write = "AES_ENCRYPT (?, 'secret-......')"
    )
    private String dataValue;

Wer kennt sich aus? Würde so ggf. API Keys zu anderen System abspeichern, ist das halbwegs sicher? 100% Sicher ist wohl nur, die Daten nicht zu speichern. Aber wenn man wie API Keys, die Daten wieder decrypten muss find ich keine andere Lösung. Hash geht ja nur in eine Richtung.
 

Thallius

Top Contributor
Fragen:

1) Warum must du die Keys in der Datenbank speichern? Sind die dynamisch? Ansonsten gehören die in eine config Datei.
2) Was willst du damit erreichen wenn Du die Daten AES verschlüsselst? Wer soll es nicht lesen können? Wenn jemand Zugriff auf deine DB hat kann er sie so auch entschlüsseln da für AES kein Salt benutzt wird
3) Normalerweise sollte jede moderne Hardware ihre Dateien auf der Festplatte automatisch verschlüsseln. Ein Auslesen aus den Datenbank Dateien ist damit eh nicht möglich wenn der User nicht ordnungsgemäß als User auf der Maschine angemeldet ist. Welches Szenario schwebt dir also vor wo jemand ohne Zugriffsrechte die Schlüssel lesen kann?
 

OnDemand

Top Contributor
Ich gehe mal davon aus, dass jemand irgendwie Zugriff auf die DB bekommt. Die API Keys sind dynamisch.

Szenarien:
1. Jemand kommt über phpMyAdmin und will die API keys haben ( aktuell API Key nicht lesbar da als LONGBLOB gespeichert)
3. Jemand kommt über Konsole an die DB und kommt an die API Keys

Der Key für das AES decrypten ist im Code und wird benötigt um die Longblobs zu entschlüsseln. Ok im Code ist vielleicht auch nicht sonderlich sinnvoll. (Muss ich mal schauen ob Spring Boot / JPA die irgendwo anders hinstecken kann).
Es erschwert aber definitiv schon mal das auslesen der Daten "mit normalem Wissen"
 

mrBrown

Super-Moderator
Mitarbeiter
Generell kannst du nur versuchen, einem möglichen Angreifer möglichst viele Hürden in den Weg zu legen.

Die Dinge verschlüsseln (AES ist da btw. völlig ausreichend) hilft schon mal gegen einige Angriffe. Wenn jemand Zugriff auf den Web-Service hat, hat er natürlich dann auch Zugriff auf den Schlüssel oder die entschlüsselten Daten.

Dagegen hilft z. B., den Teil der den Schlüssel kennt, auszulagern, extra zu sichern, und nur "indirekt" zugreifbar zu machen, z. B. in dem der keine HTTP-Schnittstelle anbietet.
 

OnDemand

Top Contributor
Vielleicht mal ein kleiner Einblick , etwas umfänglicher.

DB Server:
Externer Zugriff nur auf 2 IPs und localhost
SSH mit starkem PW geschützt (wollen wir noch auf IP beschränken, geht aber nicht so einfach weil der Provider wechselnde IPs hat mit denen er den Server managed)

"Haupt-Server"
Hier liegt eine zentrale Applikation drauf die auf die DB zugreift (dessen IP ist freigegeben). Diese nutzt JPA und kennt den AES-Key. (JPA und SQL Injection - geht das überhaupt wenn man die Repositories nutzt?

Die Haupt-App hat eine API nach aussen (mit Basic Auth abgesichert). Hier werde ich noch einbauen, dass ebenfalls nur unsere internen IPs drauf dürfen, da die API für Fremde nach außen nicht offen sein muss.

Um an die Daten zu kommen, müsste also jemand den DB Server hacken (vermutlich SSH oder über eine Lücke im OS?) und dann noch das mysql Passwort herausfinden.

Oder die Mysql Files abreifen. Die Sql Files dürften verschlüsselt sein, sehe ich das richtig? 1624716421309.png

Oder aber er kennt unsere API Endpoints und verbindet sich, dann müsste er stand jetzt das User + PW kennen (später noch durch IP gesichert) wirds ja nicht mehr möglich sein von aussen auf die API zu kommen.

Die Daten die ich mit AES sichern will, sind hauptsächer Userdaten wie deren Keys zu externen Systemen. Persönliche Daten wie Name, IBAN. Firmendaten (Adresse, Tel) stehen unverschlüsselt im Telefonbuch...das macht mE wenig Sinn.
GGF noch Email adressen der User ?
 

OnDemand

Top Contributor
Moment mal, haben wir glaube ich. Ich hab die Keydatei gespeichert daher ist mir das gar nicht mehr so bewusst.
Login mit PW geht aber dennoch. Das lass ich gleich mal abschalten, danke für den Tipp :)
 

OnDemand

Top Contributor
Alles in Allem ist das doch aber ein guter Plan oder gibts noch Verbesserungsvorschläge?
Hab da noch was gefunden, die anderen (internen) Services holen sich von der Haupt-App Daten und würden ohne https bekommen via API. Wenn die API aber nur auf 1 hört, halte ich das für ausreichend, was sagt ihr?!
 

Thallius

Top Contributor
Also ohne HTTPS finde ich eigentlich immer ein NoGo.

Für externe Zugriffe auf die API würde ich auf jeden Fall oAuth2 nehmen und nicht Basic-Auth auch wenn es deutlich mehr aufwand ist
 

OnDemand

Top Contributor
Für externe Zugriffe auf die API würde ich auf jeden Fall oAuth2 nehmen und nicht Basic-Auth auch wenn es deutlich mehr aufwand ist
merk ich mir für unsere neue App vor, die wo wir grad verbessern ist eh nicht mehr so irre lange online. Da muss Basic noch reichen. Aber was glaubst du, wie viele andere Systeme Basic nehmen. Wir haben 6 fremde Systeme angebunden, alle nutzen Basic
 

mrBrown

Super-Moderator
Mitarbeiter
Vielleicht eine Spinnerei, aber der Vorschlag von @mrBrown war ja ein separater Dienst für das Passwort. Vielleicht gibt es da ja auch was Fertiges, z. B. so wie KeePass.
Ich meinte nicht nur einen Service für das Passwort selbst, sondern ein vom Rest getrennter Service, der die Dinge, für die das Passwort nötig ist selbst macht, und das Passwort nie nach außen gibt :)

Wenn der Service von außen nur über SSH erreichbar ist, hat man nahezu alle Angriffsmöglichkeiten ausgeschlossen.

merk ich mir für unsere neue App vor, die wo wir grad verbessern ist eh nicht mehr so irre lange online. Da muss Basic noch reichen. Aber was glaubst du, wie viele andere Systeme Basic nehmen. Wir haben 6 fremde Systeme angebunden, alle nutzen Basic
Basic schützt auch nur die Client-Daten, deine eigenen Daten kann man damit nicht schützen – für reine M2M Kommunikation über HTTPS reicht Basic meist aus, Angriffsmöglichkeiten gibts da wenige.
 

OnDemand

Top Contributor
Hm wie genau meinst du. Mein Main Service ist im prinzip nicht zu erreichen ausser jemand kommt per SSH und kopiert sich die jar Datei und reversed sie. Dann kommt er an den AES key, hat dann aber noch keine Info was er damit macht. Die DB Verbindungdaten liegen in Dateien da kommt nur der root User ran (der sich mit dem KeyFile per SSH einloggen muss)
 

mrBrown

Super-Moderator
Mitarbeiter
Hm wie genau meinst du. Mein Main Service ist im prinzip nicht zu erreichen ausser jemand kommt per SSH und kopiert sich die jar Datei und reversed sie. Dann kommt er an den AES key, hat dann aber noch keine Info was er damit macht. Die DB Verbindungdaten liegen in Dateien da kommt nur der root User ran (der sich mit dem KeyFile per SSH einloggen muss)

"nicht erreichbar" heißt genau das - es gibt keine Möglichkeit den Service irgendwie direkt von außen anzusprechen, insbesondere nicht über HTTP.

Wenn SSH per public-key die einzige Zugriffsmöglichkeit ist, hat ein Angreifer keine realistische Möglichkeit.
 

OnDemand

Top Contributor
über HTTP nur über unsere API (die ja aber nur an 2 IP antwortet) Dann müsste er den anderen Server oder meinen lokalen Rechner kapern.
 

mihe7

Top Contributor
Moment mal, haben wir glaube ich. Ich hab die Keydatei gespeichert daher ist mir das gar nicht mehr so bewusst.
Login mit PW geht aber dennoch. Das lass ich gleich mal abschalten, danke für den Tipp :)
BTW: wir haben alles abgeschaltet, was nicht benötigt wird. Man verliert zwar ggf. die Kompatibilität zu Clients und ist auch nicht mehr ganz SSH-konform, das ist aber dann Problem der Clients :) Bei der Einrichtung orientieren wir uns an den Empfehlungen des BSI, ergänzen diese aber um weitere (z. B. Curve 22519 statt ECDH), setzen größere Schlüssel ein, nur DH-Gruppen 16 und 18 (4096, 8192 Bits) usw.
 

OnDemand

Top Contributor
Hat jemand ne Idee, wie ich an der Stelle meine IP ausspucken kann? Scheint ne andere als localhost zu sein

Java:
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable()
            .authorizeRequests().antMatchers("/**").hasIpAddress("127.0.0.1")
            .anyRequest().authenticated()
            .and()
            .httpBasic();
}

BTW: wir haben alles abgeschaltet, was nicht benötigt wird. Man verliert zwar ggf. die Kompatibilität zu Clients und ist auch nicht mehr ganz SSH-konform, das ist aber dann Problem der Clients :) Bei der Einrichtung orientieren wir uns an den Empfehlungen des BSI, ergänzen diese aber um weitere (z. B. Curve 22519 statt ECDH), setzen größere Schlüssel ein, nur DH-Gruppen 16 und 18 (4096, 8192 Bits) usw.
ooookay das ist zu technisch, das interessiert bestimmt meinen Servermenschen :D
 

OnDemand

Top Contributor
Ich teste den API Zugriff auf eine Whitelisted IP zu beschränken (im og Code meine lokale IP). Auf einem Testserver klappts, bekomme nur Zugriff wenn ich von einer dort angegebenen IP komme. Lokal klappts nicht, hab scheibar keine 127.0.0.1 auf meinem lokalen Rechner.
 

OnDemand

Top Contributor
Das ist klar, aber wenn ich von localhost auf localhost zugreife schon (App läuft zum test auf lokalhost) aber irgendwie macht meine Fritzbox/Mac einen hostnamen davor / dahinter wie auch immer.
 

Jw456

Top Contributor
Das hat mit deine fritzbox nichts zu tun.
Die ist da rarn nicht beteiligt.


Wenn du das brauchst willst musst du eine Weiterleitung bridge auf deinem Rechner erstellen.
 

OnDemand

Top Contributor
hmm mein rechnername wird mir aber als mbp-fritzbox angezeigt zb in eureka (wo sich die services registrieren) in der hosts steht das auch drin.
merkwürdig
 

mihe7

Top Contributor
127.0.0.1 ist der lokale Rechner mit der Top-Level-Domain "localhost". Die Pakete laufen durch einen virtuellen Netzwerk-Adapter (Loopback-Adapter) und werden an den Rechner zurückgeschleift. Dein WLAN/LAN-Adapter hat eine andere Adresse z. B. 192.168.172.25 (wird ggf. per DHCP zugewiesen). In diesem Netz ist dann Dein Rechner als z. B. rechner.fritz.box bekannt. Der Host rechner.fritz.box hat die IP 192.168.172.25, während localhost 127.0.0.1 hat. Wenn eine Anwendung derart konfiguriert wird, dass sie nur auf 127.0.0.1 lauscht, dann werden Pakete aus dem FritzBox-Netzwerk nicht beantwortet.
 

mihe7

Top Contributor
Ja, wobei das nix mit der Namensauflösung zu tun hat. Die ist lokal konfiguriert. Ich weiß nicht, wie das beim Mac ist, unter Linux gibts unter /etc/nsswitch.conf eine Datei, in der die Reihenfolge festgelegt wird, z. B., dass zuerst in den Dateien gesucht, dann erst der DNS verwendet wird (Konfiguration in /etc/resolv.conf). In der Datei /etc/hosts finden sich dann z. B. die Einträge für localhost.
 

OnDemand

Top Contributor
Hallo zusammen,

zum Thema nochmal eine Frage.

Ich speichere mit Hibernate AES verschlüsselt Daten ab. Wo könnte ich den Schlüssel hinterlegen ausser in der Annotation? Das könnte jemand reverseengeneeren vorausgesetzt er hat Zugriff auf die jar datei?

Java:
ColumnTransformer(
            read = "AES_DECRYPT(data_value, 'secret-......')",
            write = "AES_ENCRYPT (?, 'secret-......')"
    )
    private String dataValue;
 

Oneixee5

Top Contributor
Wo könnte ich den Schlüssel hinterlegen ausser in der Annotation?
Der Schlüssel ist auch im GIT-Repo sichtbar, "reverseengeneeren" ist also evtl. gar nicht notwendig. Solange der Schlüssel im Code steht gewinnt man leider keinerlei Sicherheit dazu wenn die Anwendung auf eine nicht gewollte Art und Weise benutzt wird. Ich denke vorteilhafter wäre es den Tablespace zu verschlüsseln oder die DB auf einem verschlüsseltem Storage zu betreiben. Die Berechtigungen zum Datenzugriff kann man z.B.: auf User-, Gruppen-, Rollen- oder API-Key-Ebene vergeben. Bei EE-DB's funktioniert das auch auf Spaltenebene. Es macht imho keinen Sinn für alle Daten den selben Schlüssel zu verwenden. Wenn ein Nutzer einmal Zugang zur Tabelle hat, dann kann er ja alle Daten entschlüsseln, nicht nur die, für die er auch berechtigt ist.
 

OnDemand

Top Contributor
Ja stimmt :/

Es ist aber schon mal sicherer als die Daten unverschlüsselt zu speichern. Wenn jemand an die DB kommen sollte, kann er die Daten schon mal nicht auslesen.

Zugang wird ein User nicht bekommen, die DB ist von den eigentlichen Usern nicht zugänglich. Möchten es nur vor Datenklau schützen

An die DB kommen ist nur über folgende Wege möglich:
- SSH nur von 2 IP zugelassen
- DB Verbdindung nur von Localhost erlaubt
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
6 JBDC Daten verschlüsseln? Datenbankprogrammierung 2
R Mongodb Daten werden immer überschrieben Datenbankprogrammierung 7
R Mongodb Daten in einem bestimmten Document speichern Datenbankprogrammierung 1
OnDemand Daten auf mehrere Tabellen aufteilen oder Spalten nutzen Datenbankprogrammierung 2
B Daten HSQL-DB Datenbankprogrammierung 2
V H2 ManyToMany wie speichere ich die Daten? Datenbankprogrammierung 10
thobren Projekt SQlite! Wie kann ich auf auf SQlite Daten zugreifen? Datenbankprogrammierung 4
L Oracle Daten in Häppchen selektieren Datenbankprogrammierung 5
L Oracle Daten von Oracle zu MSSQL übertragen Datenbankprogrammierung 4
D Daten aus der Firebase-Echtzeitdatenbank abfragen und in Variablen speichern (JAVA) Datenbankprogrammierung 0
Z Ausgabe nur bestimmter Daten Datenbankprogrammierung 6
E netbeans - jsp Daten in Datenbank hinzufügen Datenbankprogrammierung 2
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
Kirby.exe Vorschläge zur Verschlüsselung von Daten in der DB Datenbankprogrammierung 2
T Java Spiel Daten speichern Datenbankprogrammierung 1
LimDul H2 Embedded DB und Gigabytes an Daten Datenbankprogrammierung 0
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
R Wie mit zu viele Daten umgehen? Datenbankprogrammierung 2
F MySQL Wie speichere ich Daten zeitlich abhängig? Datenbankprogrammierung 4
T Oracle Normalisierung und Daten splitten Datenbankprogrammierung 1
JG12111989 DB-Daten werden falsch dargestellt Datenbankprogrammierung 7
K H2 Daten in die H2 console DB eintragen Datenbankprogrammierung 2
L SQLite Ändern der Daten in einem UNIQUE Feld Datenbankprogrammierung 1
S Daten von SQLite Datenbank nutzen Datenbankprogrammierung 5
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
L Oracle Daten von einem Server zum andere kopieren Datenbankprogrammierung 24
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
L MySQL Vergleichen von Array-Inhalt, Ausgabe gleicher Daten Datenbankprogrammierung 3
W Daten in Java intern abfragen Datenbankprogrammierung 1
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
I MySQL Datenbankstruktur angleichen - Daten behalten Datenbankprogrammierung 7
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
P LDAP: Daten eintragen funktioniert nicht Datenbankprogrammierung 7
B MySQL LogIn Daten im Code verstecken Datenbankprogrammierung 3
O mit Multi-Thread Daten aus Datenbank lesen und schreiben Datenbankprogrammierung 22
F Daten verdichten Datenbankprogrammierung 0
Z Finde den Fehler: Daten aus einer Access-Datenbank lesen Datenbankprogrammierung 12
B Daten aus DB in Word Dokument Datenbankprogrammierung 2
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
D Daten posten auf RestApi (Mongodb/NoSQL) Datenbankprogrammierung 0
I Fehler bei Ausgabe der Daten aus der DB Datenbankprogrammierung 3
OnDemand MySQL Daten aktualisieren Datenbankprogrammierung 6
D Daten von einem Server in eigenem Java-Programm benutzen Datenbankprogrammierung 6
M Vergleich von Daten in verschiedenen Tabellen Datenbankprogrammierung 1
S Daten aus Form in Datenbank nur einmal eintragen Datenbankprogrammierung 2
F MySQL Daten ändern über Java Datenbankprogrammierung 3
G SQLite Daten aus SQLite DB in andere SQLite DB importieren Datenbankprogrammierung 4
H Grosse Menge an Daten in eine Datenbank Datenbankprogrammierung 32
M Daten nachträglich hinzufügen Datenbankprogrammierung 6
2 MySQL Daten aus einer Array auslesen und MySQL Statment erstellen. Datenbankprogrammierung 5
E Daten einer SQL-Datenbank aus Combobox in labels schreiben Datenbankprogrammierung 6
N HSQLDB Daten Auslesen Datenbankprogrammierung 3
O Viele Verbindungen-Exception bei insert Daten zur MySQL-Datenbank Datenbankprogrammierung 2
P MySql daten in leeren jtable übertragen Datenbankprogrammierung 5
SexyPenny90 SQL Daten sortieren und top 5 ausgeben Datenbankprogrammierung 7
L Hibernat will Daten nicht einfügen??? Datenbankprogrammierung 2
B MySQL DB Daten aktualisieren Datenbankprogrammierung 9
D MySQL Daten werden aus Datenbank gelesen, obwohl sie dort gar nicht angekommen sind Datenbankprogrammierung 8
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
L SQLite Daten werden nicht in die Tabelle eingefügt Datenbankprogrammierung 7
D Übersichtliche Zuweisung von Daten in Tabellen Datenbankprogrammierung 17
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
A Problem mit Eintragen von Daten in eine Datenbank mittels DAO Datenbankprogrammierung 4
J Daten synchronisieren in Multi-Client-Anwendungen (Hibernate) Datenbankprogrammierung 6
S JPA: DB Schema ändern und Daten nicht verlieren - wie? Datenbankprogrammierung 5
T MySQL Select: Zusammenfassen von Daten und bilden von Durchschnitt? Datenbankprogrammierung 4
F Daten in die DB hinzufügen Datenbankprogrammierung 7
H Klasse welche Mysql Daten zurück gibt Datenbankprogrammierung 18
S JPA: Problem mit Update von Daten Datenbankprogrammierung 7
H Daten in/aus Datenbank schreiben Datenbankprogrammierung 2
M DropDownBoxen mit MySQL Daten füllen Datenbankprogrammierung 3
E MySQL Daten in die Datenbank eingeben via Java Programm Datenbankprogrammierung 3
F ORA 17410 Keine weiteren Daten aus Socket zu lesen Datenbankprogrammierung 2
B Daten aus Datenbank holen Datenbankprogrammierung 6
T Problem beim schreiben von daten Datenbankprogrammierung 4
N Daten aus Datenbank abfragen und anzeigen in der Praxis?? Datenbankprogrammierung 2
G MySQL Bekomme keine Daten. Datenbankprogrammierung 7
L CLOB-Daten werden beim Einfügen in die Datenbank geändert? Datenbankprogrammierung 5
G Daten aggregieren Datenbankprogrammierung 11
Gossi Oracle 2 Daten (Datum) vergleichen Datenbankprogrammierung 6
W MySQL Daten aus bestimmter Spalte lesen Datenbankprogrammierung 2
E MySQL Befüllen einer MySQL DB mit großen Daten Datenbankprogrammierung 6
J Doppelte Daten in Spalte, nur die erste abrufen wie? Datenbankprogrammierung 15
P Daten aus MySql Datenbank lesen??? Datenbankprogrammierung 6
J Daten vergleichen Datenbankprogrammierung 10
S Daten einer Tabelle vergleichen und ggs neuen Wert einfügen Datenbankprogrammierung 8
X Daten einer DatenbankTabelle in JTable darstellen Datenbankprogrammierung 13
T Designfrage: DB-Daten direkt oder verzögert speichern Datenbankprogrammierung 2
Dragonfire Daten aus jsp Datei in datenbank speichern Datenbankprogrammierung 15
A Daten von Webshop einlesen Datenbankprogrammierung 5
S Daten aus jTextfiled in DB schreiben - SQL Befehl Datenbankprogrammierung 2
T Daten aus DB in variable Zahl an Variablen speichern Datenbankprogrammierung 18
A Datenbankanbindung an mySQL und Ein-/Auslesen der Daten Datenbankprogrammierung 4
D Vector mit Daten aus der Datenbank füllen Datenbankprogrammierung 7
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
S Fehler beim Auslesen von Daten Datenbankprogrammierung 6
D Keine Ausgabe der Daten Datenbankprogrammierung 3
G Daten schneller aus einer DB auslesen Datenbankprogrammierung 9
H Daten in DB schreiben Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben