[PHP/MySQL] AES Verschlüsselung

Fee

Okay
20 April 2006
936
73
Früh am Morgen habe ich direkt eine Frage :D. Ich möchte MySQL-Einträge (Kundendaten) mit AES verschlüsseln.
MySQL bietet dafür eine Funktion, aber ich denke, es ist sicherer, die Daten mit PHP (mcrypt) zu verschlüsseln und danach an MySQL zu übergeben, da ja sonst der Klartext + Schlüssel übertragen wird, oder sehe ich das falsch? :-?

Hat jemand eine Idee, wie man den AES Schlüssel verstecken soll? Es macht wohl nicht viel Sinn, den Schlüssel direkt in das PHP-Projekt einzubetten, wenn jemand Zugriff auf die Scripte erlangt, hat er dann auch den Schlüssel..
 
Wie willst du den Schlüssel in PHP verstecken? ;)
spätestens beim Encodieren musst du den Schlüssel aus seiner maskierten Form in den Klartext überführen.
 
Wie wärs damit den schlüssel selbst zu codieren ;)

PHP:
<?
# Original #####
$mein_key = 123456789;

# Verschlüsselt #####
$_F=__FILE__;$_X='P2lCPw1WIz43enN4c0hlVz4jIyMjIw1WJFlNc0hfeU1xPlM+MGtKVUxbMWZQOw1WP2k=';$_D=strrev('edoced_46esab');eval($_D('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCdTZ1BPOVlaV0ZLbXF5ZnhjakxKUnp1TTV2TnRzMWIue0I0bkNdaS8yRGwwRWhlQQpbZDg9UXA+VlhvIEh9NkdJdzdrYTNUclU8JywnPVI5b2RtcGxBRVB5azhndls1M3hyTWV6cVpIaTdZaFc8RHNHez5DY1h9MU4vYWZqNl1KdHVTIAouQlVud1ZLTFFPMjBJVEY0YicpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));

# Ausgabe #####
$mein_key; //wie halt im Original auch
?>
 
Wie wärs damit den schlüssel selbst zu codieren ;)
Ja, das wird es bringen ... :LOL:

Wenn jemand soweit gekommen ist, dass er über die PHP-Skripte verfügt, dann wird ihn ein einfaches
PHP:
print base64_encode($mein_key);
exit;
auch nicht mehr aufhalten können, um an den Schlüssel zu gelangen. Der Effekt solcher "Verschlüsselungen" in PHP ist gleich null. ;)

@Fee: Leider wirst du nicht verhindern können, dass jemand, der über deine PHP-Skripte verfügt, auch an deinen AES-Key gelangen kann. Wenn die Kundendaten nicht dauernd im Klartext ausgelesen werden müssten (was aber wohl leider eher unwahrscheinlich ist), dann könntest du mit einer asynchronen Verschlüsselung wie RSA arbeiten. Eine andere, wirklich sichere, Methode gibt es leider nicht.
 
@Fee: Leider wirst du nicht verhindern können, dass jemand, der über deine PHP-Skripte verfügt, auch an deinen AES-Key gelangen kann. Wenn die Kundendaten nicht dauernd im Klartext ausgelesen werden müssten (was aber wohl leider eher unwahrscheinlich ist), dann könntest du mit einer asynchronen Verschlüsselung wie RSA arbeiten. Eine andere, wirklich sichere, Methode gibt es leider nicht.

Das ist mir klar, was ich will ist einfach, dass es nicht so "leicht" ist. Ich habe den Schlüssel jetzt in einer Datei außerhalb vom DocumentRoot und nur die PHP Datei, die den Schlüssel braucht, kann auf die Datei zugreifen. Wenn jetzt jemand durch einen Fehler in einer anderen PHP Anwendung Zugriff auf den Webspace erlangt, kann er den Key noch immer nicht lesen (es sei denn er hat Schreibrechte und kann das Script umschreiben, das Zugriff auf die Datei hat. *g). Sicher ist das natürlich nicht, aber immerhin besser als Kundendaten im Klartext zu speichern, wie es wohl die meisten Seiten tun ;).

Mal eine allgemeine Frage: Der Key und IV muss richtig sein, um den Ciphertext wieder zu entschlüsseln, oder?
 
Ja, das wird es bringen ... :LOL:

Wenn jemand soweit gekommen ist, dass er über die PHP-Skripte verfügt, dann wird ihn ein einfaches
PHP:
print base64_encode($mein_key);
exit;
auch nicht mehr aufhalten können, um an den Schlüssel zu gelangen. Der Effekt solcher "Verschlüsselungen" in PHP ist gleich null. ;)
Hmm bei deinem versuch ist die ausgabe aber inkorrekt:
Ausgabe: MTIzNDU2Nzg5
^^

Naja egal ihr werdest schon richten.
Aber nochmal zum zugriff auf den Webspace..
Wenn jemand zugriff aufs space bekommt dann hat er Automatisch den Schlüssel, durch ein normales echo der variable wird es halt im klartext ausgegeben, egal wo man die entsprechende Datei gespeichert hat oder wie man es verschlüsselt hat.
 
Aber nochmal zum zugriff auf den Webspace..
Wenn jemand zugriff aufs space bekommt dann hat er Automatisch den Schlüssel, durch ein normales echo der variable wird es halt im klartext ausgegeben, egal wo man die entsprechende Datei gespeichert hat oder wie man es verschlüsselt hat.

Das ist klar ;). Aber wenn er durch eine Schwachstelle in einem PHP Script eine andere Datei -angezeigt- bekommt, kann er ja nichts ändern :). Ist auch egal, hauptsache die Daten sind ein wenig geschützt.
 
Hat die Kundendatenbank auch nen Login für Kunden oder ist das nur eine Übersicht für dich? Weil dann könntest du ja selber den Schlüssel immer eingeben lassen ;) Oder du verschlüsselst die Kundendaten mit dem Loginpasswort, so hat jeder Datensatz seinen eigenen Schlüssel ;) Für den Admin müsstest du das dann natürlich doppelt speichern, weil du ja nicht die Kundenpasswörter hast. Aber vllt ist ja die Sicherheit so wichtig, dass dus lieber doppelt speicherst, als einmal das PW im Klartext iwo stehen zu haben.

Ob das geht, weiß ich nicht genau, da ich mich mit den AES Funktionalitäten von MySQL nicht auskenne. Läuft das pro Zeile, pro Tabelle oder pro Datenbank ab?
 
Na die von mir gegebene Methode war solche ein codiertes Beispiel, nur das meine Software nicht ganz so derbe teuer war wie das von Zent ^^
das soll nen Scherz sein oder? :biggrin:
Dein Code kann ich ganz einfach "knacken" indem ich aus dem eval nen print mache, das hat gar keinen Schutz was du da voschlägst.

Der ioncube-Encoder und ZendGuard bieten echten Schutz, da aus PHP ein Bytecode wird den du net einfach ändern kannst.
 
Hat die Kundendatenbank auch nen Login für Kunden oder ist das nur eine Übersicht für dich?
Kunden werden da auch Zugriff drauf haben

Weil dann könntest du ja selber den Schlüssel immer eingeben lassen ;)
Ne muss dann schon automatisch gehen.

Oder du verschlüsselst die Kundendaten mit dem Loginpasswort, so hat jeder Datensatz seinen eigenen Schlüssel ;) Für den Admin müsstest du das dann natürlich doppelt speichern, weil du ja nicht die Kundenpasswörter hast. Aber vllt ist ja die Sicherheit so wichtig, dass dus lieber doppelt speicherst, als einmal das PW im Klartext iwo stehen zu haben.
Wenn ich das nur über das KundenPW speichere, habe ich selbst keinen Zugriff drauf und wenn ichs doppelt speichere kann man es ja wieder mit dem Key aus'm Script entschlüsseln.

Ob das geht, weiß ich nicht genau, da ich mich mit den AES Funktionalitäten von MySQL nicht auskenne. Läuft das pro Zeile, pro Tabelle oder pro Datenbank ab?
Zeile afaik, aber ich verschlüssele das in PHP mit mcrypt und nicht durch MySQL.
 
Wenn ich das nur über das KundenPW speichere, habe ich selbst keinen Zugriff drauf und wenn ichs doppelt speichere kann man es ja wieder mit dem Key aus'm Script entschlüsseln.
Nein. Für dich selber, gibst du dann einfach den Key ein ;) Könntest du ja mit deinem Adminpasswort kombinieren :D
 
Hmm bei deinem versuch ist die ausgabe aber inkorrekt:
Ausgabe: MTIzNDU2Nzg5
Ich hoffe, der Post war nicht ernst gemeint. :p

Da es nicht selten vorkommt, dass Keys auch mal Zeichen außerhalb der allgemeinüblich genutzten Zeichen enthalten, habe ich als Zwischenspeicherungsmethode MIME gewählt ... ;)