Crypto Keys in Anwendung sicher speichern



  • Hallo liebes Forum!

    Ich stehe vor der Aufgabe eine Anwendung zu entwickeln, die kritische Informationen wie Kreditkarten- und Bankdaten in einer Datenbank speichern soll. Aus Sicherheitsgründen sollen diese Informationen nur verschlüsselt in der Datenbank abgelegt werden. Soweit kein Problem.

    Nun zu meiner Frage: Wie speichere ich die Schlüssel zum ver- und entschlüsseln sicher auf dem System ab? Meine Idee ist, dass dieser Schlüssel mit dem Passwort des Nutzers verschlüsselt ist und somit nicht in "Plain" auf dem System vorliegt. Der Nutzer meldet sich quasi an der Anwendung an und dann wird dieser Schlüssel mit diesem Passwort entschlüsselt.

    Sobald dieser Schlüssel aber durch das Passwort des Nutzers entschlüsselt ist, liegt dieser für die Dauer der Session im Arbeitsspeicher vor und könnte von einem intelligenten Angreifer ausgelesen werden und dieser hätte somit vollen Zugriff auf die sensiblen Daten.

    Wie kann man das verhindern? Das klingt für mich nach einem Standardproblem, für welches viele etablierte Lösungen existieren sollten.

    Ich hoffe auf eine rege Diskussion! 🙂


  • Mod

    Die Frage gab es so fast 1:1 vor ein paar Stunden hier im gleichen Forum...

    edit: Und bevor du fragst. Da:
    http://www.c-plusplus.net/forum/288841

    Die Kurzform ist: Vor anderen Nutzern (ohne Rootrechte) bist du ohnehin sicher, vor Schadprogrammen mit gleichen Rechten kannst du dich sperren.



  • Danke für die schnelle Antwort!

    Im Prinzip ist mir das auch soweit bekannt, deswegen bin ich auch nach ganz anderen Ansätzen auf der Suche. Wie machen das z. B. große Anbieter die viele Daten von Kunden vorhalten? Delegieren diese das Verschlüsseln an andere Systeme?

    Gerade in Bezug auf den Cloud-Hype und Google Docs, etc. scheint mir dieses Thema immer wichtiger zu werden. Vertrauen die Anbieter nur darauf, dass ein Angreifer niemals root Rechte erlangt?


  • Mod

    mmeyer schrieb:

    Danke für die schnelle Antwort!

    Im Prinzip ist mir das auch soweit bekannt, deswegen bin ich auch nach ganz anderen Ansätzen auf der Suche. Wie machen das z. B. große Anbieter die viele Daten von Kunden vorhalten? Delegieren diese das Verschlüsseln an andere Systeme?

    Gerade in Bezug auf den Cloud-Hype und Google Docs, etc. scheint mir dieses Thema immer wichtiger zu werden. Vertrauen die Anbieter nur darauf, dass ein Angreifer niemals root Rechte erlangt?

    Wenn du in den letzten Wochen abundan mal Nachrichten gelesen hast, wirst du mitbekommen haben, dass das genau das ist, wie es in der Praxis läuft. 😃



  • Mal eine kleine Verständnisfrage: Welche Algorithmen gedenkst du zu nutzen und warum musst du überhaupt Keys abspeichern?



  • mmeyer schrieb:

    Im Prinzip ist mir das auch soweit bekannt, deswegen bin ich auch nach ganz anderen Ansätzen auf der Suche. Wie machen das z. B. große Anbieter die viele Daten von Kunden vorhalten?

    Dienste wie Spideroak und tarsnap verschlüsseln die Daten, bevor sie in die Cloud geschickt werden. Die Firmen haben keine Keys zum entschlüsseln der Kundendaten. Selbst ein Angreifer mit root-Rechten auf den Maschinen in der Cloud kann die Daten nicht lesen.

    Zum Beispiel bei Dropbox ist das aber nicht der Fall, da kann die betreibende Firma alle Kundendaten lesen. Deswegen würde ich so einem Dienst auch ungerne meine Daten anvertrauen. Siehe zum Beispiel: http://www.wired.com/threatlevel/2011/06/dropbox/

    Bei deinem Problem wäre der erste Schritt für mich erstmal genau zu ermitteln, welche Daten wie lange gespeichert werden müssen. Kreditkarten-Infos musst du zum Beispiel vielleicht gar nicht abspeichern, sondern nur direkt für die aktuelle Abbuchung nutzen, kannst du also recht schnell wieder löschen. Daten, die nicht gespeichert sind, können auch nicht geklaut werden.

    Ansonsten würde ich die Datenbank, die solche Daten speichert, in jedem Fall auf eine separate Maschine verlagern und mit Zugriffsbeschränkungen versehen, damit nicht einfach jemand mit einem einzigen SQL-Befehl vom Webserver aus die ganze Datenbank auf einen Schlag auslesen kann. Der Webserver muss wahrscheinlich nur einzelne Kundendatensätze lesen können, nicht mehrere auf einmal. Vielleicht darf der Webserver im Normalbetrieb auch nur paar Datensätze pro Minute oder Sekunde lesen, das könnte die separate Maschine auch sicherstellen. Damit verhinderst du zumindest, dass jemand, der auf dem Webserver root-Rechte hat, sofort die komplette Datenbank kopieren kann. Wirklichen Schutz auf theoretischer Ebene bringt das aber nicht.

    Ob das in deinem Fall hilft oder nur Unsinn ist, musst du natürlich selbst beurteilen. Sind alles nur Vorschläge meinerseits.

    Ansonsten ist mein Ratschlag: Wenn du Kreditkarten-Infos unbedingt speichern musst, aber nicht weißt, wie man das sicher macht, frag jemanden, der Ahnung hat. Das kostet deine Firma im Zweifelsfall weniger Geld als der Image-Schaden durch gestohlene Kreditkarten-Infos.



  • cooky451 schrieb:

    Mal eine kleine Verständnisfrage: Welche Algorithmen gedenkst du zu nutzen und warum musst du überhaupt Keys abspeichern?

    AES. Keys speichern, da mehrere Nutzer die gleichen Datensätze entschlüsseln können sollen (daher soll dann der eigentliche Key mit den Passwörtern der Nutzer verschlüsselt werden).

    Christoph schrieb:

    mmeyer schrieb:

    Im Prinzip ist mir das auch soweit bekannt, deswegen bin ich auch nach ganz anderen Ansätzen auf der Suche. Wie machen das z. B. große Anbieter die viele Daten von Kunden vorhalten?

    Dienste wie Spideroak und tarsnap verschlüsseln die Daten, bevor sie in die Cloud geschickt werden.

    Danke für die Links. Das setzt aber voraus, dass die Daten auf dem Client bereits verschlüsselt werden und das sollte somit nicht mit Webanwendungen funktionieren. Bei diesen Diensten habe ich mich auch schon gefragt, wie diese die Sicherheit der Daten gewährleisten können. Besonders interessant ist die Frage, ob das mit Html 5 auch im Browser möglich sein wird.

    Christoph schrieb:

    Ansonsten würde ich die Datenbank, die solche Daten speichert, in jedem Fall auf eine separate Maschine verlagern und mit Zugriffsbeschränkungen versehen, damit nicht einfach jemand mit einem einzigen SQL-Befehl vom Webserver aus die ganze Datenbank auf einen Schlag auslesen kann.

    Ja, dass ist eine gute Idee!



  • mmeyer schrieb:

    Das setzt aber voraus, dass die Daten auf dem Client bereits verschlüsselt werden und das sollte somit nicht mit Webanwendungen funktionieren. Bei diesen Diensten habe ich mich auch schon gefragt, wie diese die Sicherheit der Daten gewährleisten können.

    Im Fall von tarsnap ist der Client vollständig opensource. Da kann man also als Nutzer selber prüfen, dass wirklich nur verschlüsselte Daten an die Server geschickt werden, und die Schlüssel selber den Client niemals verlassen. So gewährleistet tarsnap seine Sicherheit.

    Bei Webservices geht sowas noch nicht so gut. Aber vielleicht kann man ja irgendwann mit Javascript was ähnliches basteln. 🙂


Anmelden zum Antworten