Datenbank ver- und entschlüsseln

Passer

Erfahrenes Mitglied
Hallo,

zwecks Datensicherheit habe ich vor, die Einträge in der Datenbank bei Eintrag zu ver- und beim auslesen zu entschlüsseln.

Sicher gibt es seitens MySQL Mechanismen, wie man dies machen kann, allerdings sind mir nur jene bekannt, bei denen das Passwort in der Abfrage mitgegeben wird. Dies möchte ich vermeiden, da es durch "dumme" Zufälle passieren kann, dass evt mal in einer PHP-Fehlermeldung die SQL-Abfrage steht, welche dann das Passwort offenbart, womit der Sicherheitsgedanke für die Katz wäre ;)

Deshalb nun meine Frage, ob und vor allem, wie man solch ein Vorhaben möglichst komfortabel mittels PHP umsetzen kann.

MfG
Christoph
 
MySQL Funktion dafür ist mir nicht bekannt. Aber wie wäre es wenn du von PHP base64_decode() / base64_encode() nimmst.

Sicher kann das so JEDER ver- und entschlüsseln. Aber nicht wenn du in das Verschlüsselte einen sogenannten Salt bringst nach einem eigenen System. Zum Beispiel an irgendeine Stelle packs du ein "a" oder du tauscht alle "a" und "e" aus.

So wird das Entschlüsseln von dritten schon ein bisschen schwieriger.

Oder doppelt mit base64 verschlüsseln, Caesar-Verschlüsselung / Vigenere ... gibt sehr viele Möglichkeiten
 
Zuletzt bearbeitet:
Dies möchte ich vermeiden, da es durch "dumme" Zufälle passieren kann, dass evt mal in einer PHP-Fehlermeldung die SQL-Abfrage steht, welche dann das Passwort offenbart […]
Eine gut geschriebene Anwendung gibt keine Systemfehlermeldungen. Diese sind nur für die Entwickler gedacht, nicht jedoch für die Benutzer, da sie eben meist auch sensible Daten enthalten.
Das so oft propagierte „… or die(mysql_error())“ ist also eigentlich genau das Falsche.


Um welche Art Daten handelt es sich denn, dass du sie durch eine Verschlüsselung schützen möchtest?
 
Eine gut geschriebene Anwendung gibt keine Systemfehlermeldungen. Diese sind nur für die Entwickler gedacht, nicht jedoch für die Benutzer, da sie eben meist auch sensible Daten enthalten.
Das so oft propagierte „… or die(mysql_error())“ ist also eigentlich genau das Falsche.
Irrelevant. Es kann immer vorkommen, dass bei Debugging Operationen am laufenden System (weil nicht anders möglich) Meldungen rausgegeben werden können.
Theoretisch sollte es nicht, praktisch passiert soetwas aber. Klar kann mans vermeiden, aber man ist diesem Risiko in der Praxis immer ausgeliefert.

Ich hab offen gestanden an dieser Stelle auch keine Lust, über soetwas zu diskuttieren.

Um welche Art Daten handelt es sich denn, dass du sie durch eine Verschlüsselung schützen möchtest?
Eine Verschlüsselung ist aus Gründen des Datenschutzes notwendig.
Es ist immer möglich, dass sich irgendwer durch kaum oder wenig bekannte Sicherheitslücken oder meinetwegen auch Schlampigkeit Zugriff auf die DB verschafft.
Dem soll eben durch eine Serverseitige Ver und Entschlüsselung vorgebeugt werden.


----------------
wegen
base64_decode()

Da hatte ich von gelesen. Sollte ich nicht noch was äquivalentes für AES en- und decode finden, wird es wohl darauf hinauslaufen müssen, allerdings mit einem schlechten Gefühl in der Magengegend.

Ich finds irgendwie "lustig", dass so eine eigentlich nicht ganz abwegige Idee so schwer umzusetzen sein soll !?

PS.
Es sollen übrigens nur die Tabelleninhalte verschlüsselt sein und nicht die Spalten und Tabellennamen (weil irgendwann ist der Sicherheitswahn dann auch ein Stein im eigenen Weg ;)
 
Zuletzt bearbeitet:
Tjoa, dann würde ich dir raten, sämtliche Inhalte mithilfe der [phpf]mcrypt[/phpf] Erweiterung zu verschlüsseln.
Dort hast du eine größere Auswahl an Algorithmen und kannst dich austoben. Dazu die Verbindung zwischen Datenbank und Webserver noch per SSL absichern und du solltest dich ein Stück näher zur "sicheren" Seite der Macht begeben haben.
 
Es ist immer möglich, dass sich irgendwer durch kaum oder wenig bekannte Sicherheitslücken oder meinetwegen auch Schlampigkeit Zugriff auf die DB verschafft.
Dem soll eben durch eine Serverseitige Ver und Entschlüsselung vorgebeugt werden.
Der einfachste Weg, um auf Daten aus der Datenbank zuzugreifen, ist, Sicherheitslücken in der Anwendung zu suchen und diese auszunutzen.
Hier eine Verschlüsselung einzusetzen, ist also nicht sehr erfolgsversprechend, da die Anwendung selbst die Daten bereits wieder entschlüsselt.
 
Der einfachste Weg, um auf Daten aus der Datenbank zuzugreifen, ist, Sicherheitslücken in der Anwendung zu suchen und diese auszunutzen.
Hier eine Verschlüsselung einzusetzen, ist also nicht sehr erfolgsversprechend, da die Anwendung selbst die Daten bereits wieder entschlüsselt.


Ist mir egal, weils nicht die Frage ist.

Ich will Sicherheitslücken beim Hoster/Server... vorbeugen.

Fürs Archiv:
Ver- Entschlüsseln mit MySQL:
http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html

@Felix Jacobi
Danke, das mit Mcrypt werde ich mir dann wohl angucken müssen; das war auch so ziemlich das, wo ich auch durch eine grosse Suchmaschine drauf gestossen bin.. Fertige Frameworks für solch ein Vorhaben scheints dann wohl wirklich nicht zu geben ;)
 
Ich hoffe das du nicht in dem glauben bist, das deine Daten dann sicher wären, es dauert nur 2 Minuten länger ran zu kommen.
Und die aufgeführten Punkte, die du abwendest mit "irrelevant", "keine lust drüber zu diskutieren" oder den Tests an einem LiveSystem wo der User dann Debug informationen sieht, sind deine eigentlichen Sicherheitslücken, die trotz Verschlüsselung in der Datenbank dann wieder einen Zugriff ermöglichen. Die nicht veröffentlichen, ausgenutzten Sicherheitslücken einer Software auf einem Server sind dagegen ja schon fast nicht zu beachten.

Von Performance, gutem Softwaredesign und logischen Code brauchen wir schon gar nicht zu reden.
 
Noch eine Idee für Passer:

Beim Scripten local ist es egal, das weist du genau so gut wie ich ;)
Wenn du aber nicht willst das irgendwelche Daten in Form von Fehlermeldungen auf der Seite auftauchen, schreib doch eine Funktion für set_error_handler() die alle Fehlermeldungen ins Nirvana schickt. Ganz Stumpe Lösung : return true; :D
 
Zurück