Verschlüsselung Datenbankfelder

nchristoph

Erfahrenes Mitglied
Ok, das mach ich Überall, werd da aber den Code nochmal extra durchchecken.

Was ich eher meinte ist, für den Fall das jemand die Datenbank in die Finger bekommt.

Mein Ansatz für den OpenSSL Key wäre gewesen, den Key ausserhalb des /var/html Verzeichnisses zu speichern und den IV als hash in der Datenbank zu speichern.

Password_hash ist ja Oneway. Es ist nur ein True or False Vergleich mittels hash_verify möglich.
Einen generellen IV will ich nicht setzen und das Password als IV zu setzen ist mir nach momentanen Stand der Dinge zuviel Aufwand. Vor allem, da ich ja bei jeder Passwortänderung, und es gibt ja ab und an noch Leute, die Ihr Passwort regelmässig ändern, den Inhalt eines jeden Feldes ent- und wieder verschlüsseln muss.

Muss zwar nur einmal programmiert werden, muss halt bombenfest sein und dafür fehlt mir momentan die Routine um das 100% hinzubekommen.

Als andere Idee hätte ich gehabt, den IV random zu generieren und die IV's in einer seperaten DB zu speichern. nur hätten ich da wieder eine zusätzliche Verbindung und Resourcen verballert.

Irgendwie ist das Thema zu gross für mich habe ich so das Gefühl, weil es ja soviele Möglichkeiten und Varianten gibt.
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
Irgendwie ist das Thema zu gross für mich habe ich so das Gefühl, weil es ja soviele Möglichkeiten und Varianten gibt.
Das kann ich verstehen, aus dem Grund bin ich auch sehr vorsichtig, sichere Maßnahmen vorzuschlagen. (Andersrum aber merke ich unsichere Maßnahmen direkt hier im Forum an, falls ich sie sehe und entdecke ;))

Zu deinen Ideen im aktuellen Beitrag kann ich deswegen leider nichts beisteuern.

Im Zweifel mal auf Information Security Stack Exchange suchen und/oder fragen.
 

nchristoph

Erfahrenes Mitglied
Kein Problem.

Anders gefragt:

Ich programmiere es mal jetzt mal testhalber so:

Der Private Key wird zusammen mit der Account ID in DB2 gespeichert

Sobald 2 Personen sich gegenseitig sich z.b. eine PM schicken, wird der jeweilige Publickey mit dem Privatekey des anderen verschlüsselt und in der Datenbank mit Semikolon getrennt gespeichert.

PrivateKey und Publickey sind jeweils Key und IV für OpenSSL_encrypt und decrypt.

Die einzelnen Felder werden so OpenSSL mässig verschlüsselt und sollte jemand an die DB kommen, sieht er nur verschlüsseltes Kauderwelsch.

Ist jetzt nur ein Gehirngespenst und ich bin auch noch am austüfteln der Details, aber ich denke, so könntedas alles ziemlich sicher sein oder?
 

StormChaser

Mitglied
Hallo Zusammen,

Ich werkle gerade an einer Webseite und habe da die "Blödsinninge" Idee, die Datenbankfelder zu verschlüsseln.

Ich habe schon mit hash versucht, aber die kann man ja nur vergleichen und nicht entschlüsseln und daher für Abfragen mit WHERE Klausel nicht verwendbar.
Dann habe ich noch OpenSSL Verschlüsselung versucht nur da wird empfohlen, nie den gleichen IV doppelt zu verwenden, was das entschlüsseln bzw. WHERE Klauseln sehr schwer macht.

Passwörter habe ich bereits mit Password_hash und BCRYPT gespeichert.

Wir würdet Ihr da dran gehen?

Ob es sinnvoll ist oder nicht sei dahingestellt ist auch nicht das Thema.

Vorweg: Der letzte Satz gefällt mir sehr gut; ist auch meistens mein Credo :)

Zum Problem:
Es sind 2 mögliche Szenarien:
1. Es werden die Datensätze geladen, die über einen (Primary) Key identifiziert werden.
2. Es sollen Datensätze geladen werden, bei denen bestimmte Teil-Feldinhalte bestimmte Kriterien erfüllen.

Dass sich im ersten Fall problemlos jede Art von Verschlüsselung auf die Inhalte anwenden lässt, dürfte klar sein.

Sollen im zweiten Fall beispielsweise Datensätze geladen werden, bei denen Spalte X die Zeichenfolge
"Yippie Yah Yei Schweinebacke!"
enthält, dann ist es - mit einer Ausnahme* - eigentlich nicht möglich, Verschlüsselung anzuwenden, sofern der restliche Inhalt des Feldes unbekannt ist..

Um auf die Frage "Wir würdet Ihr da dran gehen?" einzugehen:
Für den ersten Fall bastele ich immer mal wieder etwas anderes.
Für den zweiten Fall überlege ich mir, ob es Inhalte gibt, die durchsucht werden müssen. Falls ja, hat sich das für mich mit Verschlüsselung erledigt. Falls nein, trifft der erste Fall zu.

* Jedes Zeichen ist mit einem bestimmten Schlüssel verschlüsselt.