Hallo Community,
ich arbeite an einem Projekt, bei dem jeder User in seinem persönlichen Bereich Daten abspeichern kann, die in einer db gespeichert werden, sowie Dateien hochladen kann. Daher sehe ich mich natürlich mit einigen Sicherheitsfragen konfrontiert, zu denen ich mir schon eine ganze Menge Gedanken gemacht habe, doch eine bestimmte Sache interessiert mich ganz aktuell. Vorher muss ich aber situationsbedingt ein wenig ausholen
Ich verschlüssele alle Daten, die ein User in der Datenbank einträgt mit dem Blowfish Algorithmus. Als Key für diesen dient das Loginpasswort des Users selbst, damit zum einen Fremde, und zum anderen auch ich als Anbieter, keinen Zugriff auf seine (evtl. persönlichen) hinterlegten Daten habe - letzteres also nicht nur aus Sicherheits- sondern eben auch Vertrauensgründen. Das Loginpasswort selbst wird nur als Hash in der db gespeichert, so kenne auch ich dieses nicht. Das Loginscript funktioniert über die aktuelle Session-id, die beim Login eingetragen wird und auf den geschützten Seiten abgefragt wird (es dürfte sogar weitgehend das Script sein, welches hier auf php-resource, ich glaube im Tutorial, besprochen wurde).
Das Problem an der Geschichte ist aber nun folgendes: Das Userpasswort wird nur ein einziges Mal im Klartext an den Server übermittelt, nämlich per POST beim Loginvorgang. Um dieses schließlich auch als Key nutzen zu können, ist es aber eben auch nötig, dass es dem Server im Klartext vorliegt, damit er den Blowfish Key daraus generieren kann. Da es natürlich Unterseiten gibt, muss es auch an diese übermittelt werden um den Key daraus generieren zu können. Nun sind mir bei der Entwicklung der ganzen Geschichte damals nur zwei Möglichkeiten eingefallen: Entweder als Sessionvariable, oder temporär in der Datenbank speichern. Da ich mich mit Sessionvariablen noch nicht besonders beschäftigt habe, habe ich zunächst die zweite Lösung umgesetzt, frage mich aber, ob das so praktikabel ist bzw. ob erstere Version nicht doch besser wäre.
Und deshalb wende ich mich nun an euch, um evtl. ein paar Tipps zu erhaschen. Momentan läuft das folgendermaßen ab: Beim Login wird das gePOSTete Passwort zunächst mit einem Masterkey verschlüsselt und so in der Datenbank temporär abgelegt. Bei jeder Usereingabe wird dann dieses verschlüsselte pw wieder aus der db geholt, wieder decrypted, daraus der Userkey generiert und mit diesem dann die Userdaten verschlüsselt und so in der Datenbank gespeichert. Klingt hoffentlich jetzt nicht all zu verwirrend
Ich hielt diese Lösung durchaus für praktikabel, da zumindest auf dem Clientrechner das Passwort nicht im Klartext vorliegt (wir gehen jetzt mal davon aus, dass der User die Webseite besonders nicht nur von seinem eigenen, sondern durchaus auch von fremden und öffentlichen Rechnern aus verwenden wird). Nur wird dadurch imho diese "Vertrauensgeschichte" wieder ein Stückweit ausgehebelt, da ich als Admin, der Kenntnis vom Masterkey hat, das temporäre Userpasswort decodieren könnte. Zumindest während einer Session, denn danach wird es ja wieder gelöscht.
Wie würdet ihr das lösen? So beibehalten, oder lieber in eine Sessionvariable packen, oder hätte jemand einen evtl. noch deutlich besseren Tipp? Oft sieht man ja den Wald vor lauter Bäumen nicht...
Freue mich über ein paar Tipps und hoffe, mein "Problem" nicht zu konfus dargestellt zu haben.
ich arbeite an einem Projekt, bei dem jeder User in seinem persönlichen Bereich Daten abspeichern kann, die in einer db gespeichert werden, sowie Dateien hochladen kann. Daher sehe ich mich natürlich mit einigen Sicherheitsfragen konfrontiert, zu denen ich mir schon eine ganze Menge Gedanken gemacht habe, doch eine bestimmte Sache interessiert mich ganz aktuell. Vorher muss ich aber situationsbedingt ein wenig ausholen
Ich verschlüssele alle Daten, die ein User in der Datenbank einträgt mit dem Blowfish Algorithmus. Als Key für diesen dient das Loginpasswort des Users selbst, damit zum einen Fremde, und zum anderen auch ich als Anbieter, keinen Zugriff auf seine (evtl. persönlichen) hinterlegten Daten habe - letzteres also nicht nur aus Sicherheits- sondern eben auch Vertrauensgründen. Das Loginpasswort selbst wird nur als Hash in der db gespeichert, so kenne auch ich dieses nicht. Das Loginscript funktioniert über die aktuelle Session-id, die beim Login eingetragen wird und auf den geschützten Seiten abgefragt wird (es dürfte sogar weitgehend das Script sein, welches hier auf php-resource, ich glaube im Tutorial, besprochen wurde).
Das Problem an der Geschichte ist aber nun folgendes: Das Userpasswort wird nur ein einziges Mal im Klartext an den Server übermittelt, nämlich per POST beim Loginvorgang. Um dieses schließlich auch als Key nutzen zu können, ist es aber eben auch nötig, dass es dem Server im Klartext vorliegt, damit er den Blowfish Key daraus generieren kann. Da es natürlich Unterseiten gibt, muss es auch an diese übermittelt werden um den Key daraus generieren zu können. Nun sind mir bei der Entwicklung der ganzen Geschichte damals nur zwei Möglichkeiten eingefallen: Entweder als Sessionvariable, oder temporär in der Datenbank speichern. Da ich mich mit Sessionvariablen noch nicht besonders beschäftigt habe, habe ich zunächst die zweite Lösung umgesetzt, frage mich aber, ob das so praktikabel ist bzw. ob erstere Version nicht doch besser wäre.
Und deshalb wende ich mich nun an euch, um evtl. ein paar Tipps zu erhaschen. Momentan läuft das folgendermaßen ab: Beim Login wird das gePOSTete Passwort zunächst mit einem Masterkey verschlüsselt und so in der Datenbank temporär abgelegt. Bei jeder Usereingabe wird dann dieses verschlüsselte pw wieder aus der db geholt, wieder decrypted, daraus der Userkey generiert und mit diesem dann die Userdaten verschlüsselt und so in der Datenbank gespeichert. Klingt hoffentlich jetzt nicht all zu verwirrend
Ich hielt diese Lösung durchaus für praktikabel, da zumindest auf dem Clientrechner das Passwort nicht im Klartext vorliegt (wir gehen jetzt mal davon aus, dass der User die Webseite besonders nicht nur von seinem eigenen, sondern durchaus auch von fremden und öffentlichen Rechnern aus verwenden wird). Nur wird dadurch imho diese "Vertrauensgeschichte" wieder ein Stückweit ausgehebelt, da ich als Admin, der Kenntnis vom Masterkey hat, das temporäre Userpasswort decodieren könnte. Zumindest während einer Session, denn danach wird es ja wieder gelöscht.
Wie würdet ihr das lösen? So beibehalten, oder lieber in eine Sessionvariable packen, oder hätte jemand einen evtl. noch deutlich besseren Tipp? Oft sieht man ja den Wald vor lauter Bäumen nicht...
Freue mich über ein paar Tipps und hoffe, mein "Problem" nicht zu konfus dargestellt zu haben.
Kommentar