Vorgehensweise beim Verschlüsseln mit PHP

Guten Tag,

ich arbeite derzeit an einem PHP-Projekt bei dem sich der User kostenpflichtig registrieren kann.
Nach einer Registrierung hat der User die Möglichkeit ein Bankkonto für seinen Account freizuschalten. Das Konto dient dann dazu, dass bei Verlängerung des Accounts (durch den User selbst) von dem Konto per Lastschrift die Mitgliedsgebühr abgebucht wird, falls der User dies wünscht.
Ebenfalls werden auf das Konto gegebenenfalls Gutschriften überwiesen.

Nun das Problem:
Um die Kontodaten zu sichern wollte ich sie verschlüsselt in der Datenbank abspeichern. Da man aber in regelmäßigen Abständen das Passwort ändern sollte habe ich nun folgende Idee:
Das Passwort zum Ver-/Entschlüsseln der Kontodaten wird ebenfalls „verschlüsselt“ in der Datenbank gespeichert.

Ablauf:

  1. User gibt Kontodaten an => Die Kontodaten werden per SSL an den Server übertragen.
  2. Die Auswertungsdatei „A“ leitet die Kontodaten an Datei „B“ weiter.
  3. Datei B holt sich aus der Datenbank den „verschlüsselten“ Key und entschlüsselt ihn mit dem Key, welcher in der Datei „B“ als Variable gespeichert ist. Wenn nun der „entschlüsselte“ Key mit der zweiten Variable, welches der bereits entschlüsselte Key ist, übereinstimmt, so werden die Kontodaten mit dem zuvor entschlüsseltem Key verschlüsselt oder auch beim Auslesen der Daten entschlüsselt.

Ich möchte eben meinen wichtigen Key in der Datenbank verschlüsselt speichern, da ich ihn bei mehreren Dateien benötige und wenn ich nun den Key wechseln möchte, so muss es in mehreren Dateien geändert werden und es könnte schnell ein Fehler auftauchen, was ziemlich fatal wäre. Mit der Datenbank müsste ich es nur

  • in der Datenbank ändern
  • in der Datei B
  • und zusätzlich könnte ich den Key, welches mein Passwort / Key aus der DB entschlüsselt, auch relativ schnell ändern.

Nun wollte ich mich erkundigen, ob mir jemand einen tipp geben könnte wie ich es noch deutlich sicherer machen könnte oder wo meine Idee gewisse Macken hat.

Ich wäre sehr dankbar für gewisse Kritiken oder Verbesserungsvorschläge, da das Projekt sehr wichtig für mich ist.

Vielen Dank.

Hi
Nur nochmal um es zu verstehen

Datei B:
var sKey1 = Key zum entschlüsseln des Keys der aus der Datenbank kommt
var sKey2 = Key der dem mit sKey1 entschlüsseltem Key aus der Datenbank entspricht

Datenbank:
var sKey3 = verschlüsselter sKey2

Die Kontodaten willst du nun mit sKey3 verschlüsseln.

Wenn dem so ist brauchst du den sKey3 nicht extra in der Datenbank speichern. Du hast ihn ja eh vorliegen in der Datei B als sKey2.
Sogesehen liegt dort der Schlüssel frei rum.

Gruß Lamer

Guten Tag,

Es ist mir bewusst, dass er in der Datei B frei rumliegt. Ich versuch eben nur die Vorgehensweise zu verschärfen, damit man nicht so schnell dahinterkommt.
Ich dachte mir eben, dass ich in der Datei „B“ den bereits entschlüsselten Key speicher, um abfragen zu können, ob der „zuvor“ entschlüsselte Key aus der Datenbank dem in der Datei B gespeicherten Key gleich ist. Falls ja, so soll er die Aktion ausführen (Ver- oder Entschlüsseln der Kontodaten).

Die Passwörter haben alle eine Länge von je 56 Zeichen.
Ich grübel derzeit über eine Vorgehensweise nach, die nicht so leicht zu durchschauen ist und mir somit die sensiblen Kundendaten absichert, falls jemand auf die Datenbank gelangen sollte.

Dem Key in der Datenbank würde ich eben nicht unbedingt als Key oder Passwort bezeichnen, sondern einen trivialen Namen geben, damit man nicht sofort draufschließt, dass es sich um einen Key handelt.

Das was du also machen willst drückt ein Spruch aus den ich im Studium gelernt habe:
security by obscurity

Und das was wir dort gelernt haben ist, das dies der falsche Weg ist.

Denn spätestens beim Refactorieren deiner Funktionen wirst du (vielleicht nicht sofort aber in 2 Jahren gewiss) selbst nicht mehr wissen was vor sich geht.

Daher von mir ein Rat:
Versuche eine Lösung zu finden die sicher ist, weil sie sicher ist und nicht die eine Sicherheit vorgaukelt weil es schwer ist herauszufinden was dort passiert.

Es wird immer jemanden geben der sich die Mühe macht (wenn es sich lohnt) und dein Programm debugt und so auf die Lösung kommt, wenn es nicht sicher ist.

Und wie gesagt wenn jemand an die Daten der Datenbank kommt dann sollte es für diesen auch nicht das Problem sein sich die Dateien anzugucken die die Daten verschlüsseln und mit ein bisschen suchen und GREP findet man das schnell raus.

Gruß Lamer
PS: Sorry das das nicht die antwort ist die du bisher erwartet hast

Da hast du vollkommen Recht und ich stimme dir auch zu, dass es nicht unbedingt der richtige Weg ist, wenn man versucht gewisse Sachen zu verschleiern.
Bloß fällt mir im Moment keine andere Vorgehensweise ein, um die Vorgehensweise komplex und sicher zu gestalten.
Wenn ich es zu simpel gestalte, dann denk ich, dass es zu trivial ist bsp:
In der Datei „B“ ist eine Variable mit meinem Key (56 Zeichen lang) mit welchem ich eben meine sensiblen Daten ver-/entschlüssele.
Ein Angreifer müsste ja lediglich an die Datei „B“ kommen und schon hat er alles notwenige.
Bloß wenn ich es im Grunde genau betrachte, wäre dies auch der Fall, wenn ich es mit meinem Vorschlag verwirkliche, da da ja eh der Key unverschlüsselt liegt.

Ich bin grad ziemlich ratlos wie ich eine sehr sichere Vorgehensweise kreieren könnte :frowning: .

Falls jemand irgendwelche Anregungen oder Tipps hätte, so wäre ich sehr dankbar dafür!

Hi
Genau das war es worauf ich hinaus wollte.

Und zu deinem Problem:
Wenn jemand an die Datei B kommt und an deine Datenbank dann hast du ganz andere Probleme als die Verschlüsselung.

Wenn du aber unbedingt einen Weg haben willst denk mal in diese Richtung:

Externer Schlüssel.

Zweite Domain/Ip dort liegt ein Skript das den Schlüssel hat.
Wenn Datei B den Schlüssel braucht fragt es bei dieser Domain nach.
Diese guckt sich die IP an woher die Anfrage kommt und wenn man will kann man sogar noch PIN/TAN Sicherheiten mit einbauen und das noch dynamisieren.

Wenn er an die Datei B kommt müsste er dann von dort eine anfrage an die 2. Domain stellen und die richtigen Pins zur richtigen Zeit benutzen.

Das sollte das ganze schon etwas erschweren.

Gruß Lamer

Hej Lahmer
„vielen“ Dank für deinen Hinweis / Vorschlag.
Es erscheint mir deutlich sicherer als meine triviale Idee.

Was meinst du zu dem Vorschlag, welcher auf deinem Vorschlag basiert:
Grundlage:

  • Server2 ist komplett von der Außenwelt abgeschottet. Nur die IP des Server1 ist freigeschaltet.
  • Server1 und Server2 haben ein Script, welches dynamisch PIN und TAN generieren

Vorgehensweise:

  1. Server1 will Kontodaten ver-/entschlüsseln
  2. Server1 generiert PIN und TAN anhand mehrerer Parameter.
  3. Server1 kontaktiert Server2 unter Angabe der PIN und TAN als Hashwerte und zusätzlich sendet er weitere Parameter mit
  4. Server2 prüft die IP des eingehenden Request, falls die IP der IP vom Server1 entspricht, so wird das Script ausgeführt.
  5. Server2 erzeugt ebenfalls anhand eines Scripts dynamisch eine PIN und TAN, anschließend generiert er 2 Hashwerte daraus und vergleicht diese mit den übermittelten Werten. Falls diese übereinstimmen, so wird das Script weiter ausgeführt.
  6. Anhand der vom Server1 zusätzlich übermittelten Parameter wird ein Key generiert.
  7. Der generierte Key wird mit einem im Script abgespeicherten Key kombiniert:blush:key1 .= key2;
  8. Der Key wird an Server1 zurückgegeben.
  9. Server1 führt seine gewünschte Aktion aus.

Wäre dankbar für deine Meinung und auch für die Meinung anderer bezüglich der Sicherheit dieser Vorgehensweise.