Ich entwickle ein lokales Intranetsystem in PHP / MySQL, um unsere Kundendaten zu verwalten. Es scheint, dass die beste Vorgehensweise darin besteht, die vertraulichen Daten auf dem MySQL-Server während der Eingabe zu verschlüsseln.
Ich bin mir jedoch nicht sicher, was der beste Weg wäre, dies zu tun, während die Daten immer noch leicht zugänglich sind.
Es scheint eine schwierige Frage zu sein: Wo werden die Schlüssel gespeichert? Wie schütze ich den Schlüssel am besten? Wenn der Schlüssel auf dem Computer jedes Benutzers gespeichert ist, wie kann er geschützt werden, wenn der Computer ausgenutzt wird? Wie kann der Schlüssel geändert werden, wenn der Schlüssel ausgenutzt wird?
Wie soll der Schlüssel dort geschützt werden, wenn er in der Datenbank gespeichert werden soll? Wie würden Benutzer darauf zugreifen?
quelle
Antworten:
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:
Lassen Sie uns nun darüber sprechen, wie die serverseitige Verschlüsselung auf diese Situationen angewendet wird:
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:
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.
quelle
Vielleicht möchten Sie sich ezNcrypt ansehen , das ecryptfs, Zugriffskontrollen und Schlüsselverwaltung verwendet, um eine hohe Sicherheit und Leistung für die Linux-Verschlüsselung von MySQL-Datenbanken und anderen Prozessen bereitzustellen. Nein, ich arbeite nicht für sie.
quelle
Sie könnten Scytale verwenden. Es ist ein NoSQL-Krypto-Proxy für moderne DBMS- und Webanwendungen. Unterstützt die Verschlüsselung mit mehreren Empfängern und Gruppen. Geladen mit einem starken RSA / AES-Kryptosystem. Es ist auch 100% kostenlos und Open Source.
https://bitbucket.org/maximelabelle/scytale
quelle