Es gibt eigentlich keine integrierten MySQL-Funktionen für die Verwaltung komplexer Verschlüsselungsschlüssel-Setups. Sie müssen den Großteil der Verschlüsselungslogik in Ihrem eigenen PHP- und / oder Browserseitencode (Javascript?) Implementieren.
Ihre Bedenken sind jedoch etwas eigenartig: Ihre einzigen wirklichen Bedenken scheinen eine SQL-Injection oder ein Brute-Force-Angriff (ich nehme an, das Erraten von Passwörtern) von einer Remote-Client-Desktop- / Laptop-Workstation aus zu sein. Das lässt mich vermuten, dass Sie bereits andere, nicht erwähnte Sicherheitsmaßnahmen geplant haben und die möglichen Kompromissmöglichkeiten analysiert haben.
Zum einen gehe ich davon aus, dass Sie Firewall-Regeln haben, die den MySQL / PHP-Host vor jeglichem Zugriff durch nicht genehmigte Remote-Client-IPs schützen. Wenn ich richtig liege, ist es sinnvoll, dass Sie sich nur über Angriffe von den Workstations kompromittierter Benutzer Sorgen machen.
Ich gehe auch davon aus, dass Sie verstehen, dass die Daten dieses Clients unabhängig von der Verschlüsselung oder anderen Sicherheitsvorkehrungen keinen Schutz bieten, wenn ein Angreifer auf dem Remote-Client-Host zu Root- / Administrator-Rechten eskalieren oder das eigene Konto des realen Benutzers direkt gefährden kann. (Der Angreifer kann die Schlüssel von jedem Ort aus lesen, an dem sie auf der Festplatte gespeichert sind, oder sie abhören, wenn der echte Benutzer sie bei der Anmeldung eingibt, und Schlüssel führen zu Daten.)
Ausgehend von diesen beiden Annahmen ist es für uns sinnvoll zu folgern, dass die einzigen zwei relevanten Bedrohungen A) Brute-Force-Kennwortraten und B) SQL-Injection-Versuche sind:
- Wenn der Angreifer den Schlüssel des realen Benutzers nicht erhält oder auf mehr als nur die Daten des realen Benutzers zugreifen möchte, kann er versuchen, Anmelde-Creds für den realen Benutzer oder ein anderes Konto brutal zu erzwingen. (Theoretisch könnten Sie jedes Konto für eine bestimmte Remote-Client-IP sperren, um auch die Risiken zu unterteilen.)
- Wenn der Angreifer einen gültigen Schlüssel für den realen Benutzer erhält, hat er einen Weg hinter dem Anmeldebildschirm (der vermutlich einfach genug ist, um sicher zu sein) zum weichen Unterbauch des möglicherweise fehlerhaften App-Codes. Eine erfolgreiche SQL-Injection aus dem Kontext des realen Benutzers könnte ihm auch Zugriff auf andere Clientdaten gewähren.
Lassen Sie uns nun darüber sprechen, wie die serverseitige Verschlüsselung auf diese Situationen angewendet wird:
- Die serverseitige Verschlüsselung hilft definitiv gegen die Bedrohung durch SQL-Injection. Wenn die Zeilenwerte in den DB-Tabellen verschlüsselt sind, kann der Angreifer nur Kauderwelsch-Chiffretext der Daten sehen, die zu anderen Konten gehören. Die Bedrohung ist eingedämmt und unterteilt.
- Das brutale Erzwingen des Erraten von Passwörtern wird für einen Angreifer, der mit serverseitiger Verschlüsselung konfrontiert ist, jedoch nicht wirklich schwieriger. Unabhängig davon, ob die Schlüssel der Benutzer auf dem Server gespeichert oder vor Ort aus dem Kennwort generiert werden, ist es nur wichtig, ob Sie das richtige Kennwort haben. Entweder lässt der Server zu, dass Sie den gültigen gespeicherten Schlüssel verwenden, weil er überprüft, ob Ihr Kennwort korrekt ist, oder er berechnet den gültigen Schlüssel für Sie, da Ihr Kennwort die richtige Eingabe zum Generieren dieses Schlüssels ist.
Die clientseitige Verschlüsselung macht Brute-Force-Kennwortangriffe dagegen irrelevant. Sie können einen richtig konstruierten Schlüssel nicht brutal erzwingen. Die clientseitige Verschlüsselung bietet grundsätzlich den gleichen Schutz gegen SQL-Injection wie die serverseitige Verschlüsselung. Der Client kann den Schlüssel bei der Anmeldung an den Server übergeben und eine Kopie im Speicher behalten, bis die Sitzung beendet ist, wodurch der Server von der Krypto-CPU belastet wird. Oder der Client kann die Verschlüsselung / Entschlüsselung selbst im Browser durchführen. Beide Techniken haben Höhen und Tiefen:
- Die Übergabe des Schlüssels an den Server ist viel einfacher zu codieren und zu verwalten und aufgrund des optimierten Kryptocodes (wahrscheinlich kompiliertes C) in der Regel viel schneller.
- Ein reiner clientseitiger Ansatz bietet zusätzliche Sicherheit, da selbst wenn ein Angreifer auf dem Server root wird, er die verschlüsselten Daten immer noch nicht lesen kann und sie niemals lesen kann. Der einzig mögliche Angriffsvektor besteht darin, die Remote-Client-Workstation zu gefährden.
Abschließend möchte ich darauf hinweisen, dass die Verschlüsselung von Daten in der Datenbank einige enorme betriebliche Nachteile hat. Da es sich bei den verschlüsselten Datendarstellungen im Wesentlichen um zufällige Muster handelt, funktionieren grundlegende Datenbankfunktionen wie Indizierung, Verknüpfungen usw. nicht. Der Client übernimmt eine enorme logische Belastung und kann viele der Vorteile verlieren, die Datenbankfunktionen normalerweise bieten.