it-swarm.com.de

Ist "Warum sollten Sie AES in MySQL vermeiden?" wahr?

Aus ein Artikel des Smashing Magazine 2012 Es wird eine ziemlich kühne Aussage gemacht, um AES in MySQL selbst zu vermeiden. Oder wie sie es ausdrücken "Warum sollten Sie AES in MySQL vermeiden?". Wenn Sie jedoch nach SQL-Verschlüsselung suchen, finden Sie häufig das AES_ENCRYPT aus (My) SQL erwähnt. Ich sage nicht, dass viele Suchergebnisse bedeuten, dass die Aussage falsch ist, aber es hat mich nur zum Nachdenken gebracht: Sind die drei unten genannten Gründe tatsächlich wahr?

Was denken die Sicherheitsexperten hier über die Gründe, "warum Mcrypt von PHP den AES-Funktionen von MySQL überlegen ist":

  • MySQL benötigt eine Datenbankverbindung zwischen der Anwendung und der Datenbank, damit die Ver- und Entschlüsselung erfolgen kann. Dies kann zu unnötigen Skalierbarkeitsproblemen und schwerwiegenden Fehlern führen, wenn die Datenbank interne Fehler aufweist, wodurch Ihre Anwendung unbrauchbar wird.

Ich kann dieses Problem nicht verstehen. Wenn Sie in PHP verschlüsseln/entschlüsseln, müssen Sie auch die Werte in der Datenbank mit einem Datenbanklink speichern? Wenn die Entschlüsselung auf PHP-Seite fehlschlägt, führt dies auch zu Anwendungsfehlern? Was ist der Punkt hier gemacht?

  • PHP kann die gleiche MySQL-Entschlüsselung und -Verschlüsselung mit einigem Aufwand durchführen, jedoch ohne Datenbankverbindung, was die Geschwindigkeit und Effizienz der Anwendung verbessert.

PHP kann es "mit etwas Aufwand" und das verbessert die Geschwindigkeit der Anwendung? Da Sie verschlüsseln, bevor es über das Kabel gesendet wird, gewinnt die Anwendung (die die Verschlüsselung übernimmt) an Geschwindigkeit und Effizienz? Wie könnte das wahr sein? Meiner Meinung nach geht es um das "beste Werkzeug für den Job", daher bedeutet das Argument, dass "PHP auch fähig ist" per se nicht, dass es das beste Werkzeug auch. Es ist nur ein Werkzeug, ohne das Argument, warum es das beste Werkzeug ist.

  • MySQL protokolliert häufig Transaktionen. Wenn also der Server der Datenbank kompromittiert wurde, erzeugt die Protokolldatei sowohl den Verschlüsselungsschlüssel als auch den ursprünglichen Wert.

Dies ist ein gültiger Punkt, wenn Sie Werte in der Datenbank verschlüsseln und die Protokollierung aktiviert haben. Zumindest sollten Sie das allgemeines Abfrageprotokoll deaktivieren, da das binäres Protokoll nur Transaktionen protokolliert, aber keine select-Anweisungen. Wenn Sie überhaupt keine Protokollierung benötigen, können Sie einfach die Anweisung "Wenn Sie AES in MySQL verwenden, deaktivieren Sie die gesamte Protokollierung" abgeben. Das klingt für mich gültiger als "Wenn Sie AES in MySQL verwenden möchten, tun Sie es in PHP".

Kann mir jemand erklären, warum die oben genannten Punkte gültig sein könnten und warum es im Allgemeinen besser ist, Ihre Daten in Ihrer (PHP-) Anwendung zu verschlüsseln, als in (Mein) SQL.

23
Jurian Sluiman

Der Hauptgrund, AES_ * -Funktionen in MySQL nicht zu verwenden, liegt darin, dass sie den unsicheren EZB-Blockbetriebsmodus verwenden.

Lesen Sie mehr unter:

https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

Bearbeiten: Seit MySQL 5.6.17 haben sich die Dinge geändert und MySQL unterstützt den CBC-Blockmodus, muss jedoch manuell aktiviert werden. Lesen Sie http://mysqlserverteam.com/understand-and-satisfy-your-aes-encryption-needs-with-5-6-17/

17
Matrix

In Bezug auf die Leistung schlage ich vor, MySQL die AES-Verschlüsselung durchführen zu lassen, ist keine große Sache. Es wird wahrscheinlich (im Durchschnitt) viel mehr Zeit für das Abrufen/Schreiben der Daten verschwenden als für das Verschlüsseln. Dies gilt nur, wenn Ihre Datenbank jemals verschlüsselt und entschlüsselt.

Trotzdem gibt es ein großes Problem, wenn Sie MySQL das AES ausführen lassen: Sie benötigen Ihre PHP -Anwendung, um eine Abfrage gegen MySQL auszugeben, bei der der Verschlüsselungsschlüssel als Klartext übergeben wird. Zum Schutz müssten Sie diese verwenden Eine sichere Verbindung oder ein Befehl tcpdump kann Ihre PHP-MySQL-Diskussion leicht abhören.

Wenn Ihre PHP App die Daten intern verschlüsselt, bedeutet dies, dass Ihre Daten weniger verfügbar sind und eine Komponente weniger, die sich mit unverschlüsselten Daten oder sichtbaren Schlüsseln befasst.

5
Shlomi Noach

(Ich bin nicht der Meinung, dass es sich um ein Duplikat von handelt. Ist es vorzuziehen, eine Verschlüsselung mit Datenbankfunktionen oder Code durchzuführen? , obwohl es viele Überlappungen gibt.)

Die einzige Rechtfertigung, die ich mir für den Beitrag vorstellen kann - und sie ist wichtig und gültig - ist, dass es einfach ist, die Anwendungsebene (PHP) zu skalieren, aber eine relationale Datenbankebene (MySQL) schwer zu skalieren. Für den ersteren fügen Sie einfach mehr Server hinzu - für den letzteren sind größere Boxen/koordiniertes Clustering erforderlich. Daher reduziert die Verschlüsselung in PHP die Belastung des DBMS.

In Bezug auf "MySQL benötigt eine Datenbankverbindung ..." führt das Senden der Daten zur Verarbeitung an eine andere Stelle zu einer Latenz. Das Berechnen des verschlüsselten oder entschlüsselten Werts einiger Daten kann harte Arbeit sein - aber es ist unwahrscheinlich, dass es fast so lange dauert, wie Daten über ein Netzwerk zu senden.

Die übergeordnete Frage ist jedoch, wie dies in das Sicherheitsmodell passt - und hier kommt die Frage nach Protokollen und Schlüsselverwaltung ins Spiel.

4
symcbean

Gemäß der MySQL-Dokumentation zu den Verschlüsselungsfunktionen http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html

Vorsicht

Kennwörter oder andere vertrauliche Werte, die als Argumente für Verschlüsselungsfunktionen angegeben werden, werden im Klartext an den MySQL-Server gesendet, sofern keine SSL-Verbindung verwendet wird. Außerdem werden solche Werte in allen MySQL-Protokollen angezeigt, in die sie geschrieben werden. Um diese Art der Gefährdung zu vermeiden, können Anwendungen vertrauliche Werte auf der Clientseite verschlüsseln, bevor sie an den Server gesendet werden. Die gleichen Überlegungen gelten für Verschlüsselungsschlüssel. Um diese nicht offen zu legen, können Anwendungen gespeicherte Prozeduren verwenden, um Werte auf der Serverseite zu verschlüsseln und zu entschlüsseln.

Um dies zu vermeiden, empfehlen sie die Verschlüsselung auf der Clientseite.

4
Karthick