Hallo zusammen
Von vorne weg: Ich weiss, das ich wahrscheinlich nicht im richtigen Unterforum bin - aber finde leider kein geeignetes und fühle mich hier wohl am "heimischsten" *g* - falls wo besser aufgehoben, ungeniert verschieben =)
Von vorne weg 2: Hui, viel Text,... sorry =(
Zur Ausgangslage:
Bei neuen Webauftritten von uns müssen wir ein paar Webservices anbieten. Eine Funktionalität ist, dass bei einer Registrierung ein "activation code" generiert wird, welcher als Link per E-Mail verschickt wird. Der Benutzer klickt auf den Link und sein Account wird aktiviert. Diese Anforderung beinhaltet, dass wir das Datum speichern müssen, wann der Account aktiviert wurde.
Datenbankmässig würden wir's so lösen, dass wir eine Tabelle User und eine Tabelle Activation haben, die Activation hält den Foreign Key zur User-Tabelle. Soweit, so gut.
Nur, wo speichern wir das Aktivierungsdatum? Eher in der Usertabelle oder in der Activation-Tabelle? Weil dann muss man sich natürlich auch Gedanken über die Abfrage machen. Wir rechnen mit einigen Zehntausend Rows, über die man dann einen Select absetzt, der einen bis zu 64-stelligen Key (da wird weiter unten drauf eingegangen) sucht. Würde man das Aktivierungsdatum in der Tabelle Activation halten, könnte man hier wenigstens noch der Abfrage mitgeben, dass das Aktivierungsdatum null sein muss - hier rechnen wir natürlich mit viel weniger Rows (also weniger Benutzer, die ihren Account noch nicht aktiviert haben).... aber die Überlegungen gehen dann noch weiter ...
Dann haben wir uns die Frage gestellt, wie soll der Aktivierungscode aufgebaut, resp. generiert werden? Ich hätt jetzt mal behauptet, wir nehmen E-Mailadresse + ":" + Erstellungstimestamp und lassen nen SHA-256 drüberlaufen. Somit ist der Aktivierungscode reproduzierbar.
Dann ist uns eingefallen "Ja, moment mal. Wenn er reproduzierbar ist, warum speichern wir ihn dann überhaupt?" Nun, wenn wir ihn nicht speichern, bekommen wir nur mühsam wieder die Information raus, welchem Benutzer dieser Aktivierungskey gehört.
Dann kam die glorreiche Idee, den Primärschlüssel in der Aktivierungstabelle irgendwie in den Aktivierungscode zu bekommen. Also sieht's dann so aus "AKTIVIERUNGSCODE" + "PRIMARYKEY". Da haben wir natürlich den Riesenvorteil, dass wir die Abfrage auf den PK machen können. Dann haben wir den Aktivierungscode, von dort kommen wir an den User und können überprüfen, ob der übergebene Aktivierungscode mit dem übereinstimmt, was wir reproduzieren (also SHA-256(email + ":" + creationtimestamp).
Nur, wir schicken sicher keinen Primary Key in einem Aktivierungscode per E-Mail. Also könnte man ja z.B. den PK bei z.B. 1'000'000 beginnen und da drüber nen XOR drüber laufen lassen, welches man dann bei der Abfrage wieder "zurück-ver-XOR-en" müsste.
Also, dann würde das am Schluss so aussehen
Registrierung ->
Key Generieren -> SHA-256(email:creationtimestamp) + XOR(primary key Aktivierungstabelle, "Verschlüsselungskey")
Aktivierung ->
Substring Activation Code -> die ersten 64 Stellen sind der Hash, der Rest ist PK
-> den "Rest PK" zurück-x-oren
-> Select auf Aktivierung anhand des zurück-ge-x-orten-wertes (also vom effektiven PK), join auf User
-> Generierung des SHA-256-Hashs anhand der Benutzerdaten
-> Überprüfung der ersten 64 Stellen des Activation Keys mit dem, was wir anhand der Tabelle generiert haben.
So, nun, eben, eigentlich haben wir eine Lösung. Nur ist das ganze doch sehr aufwendung und komplex.
Wer von euch hat schon Erfahrungen damit gemacht, und wie habt ihr es gelöst?
Gibt's Fehler in unseren Überlegungen? Oder sind wir da komplett am Ziel vorbeigeschossen, resp. übertreiben wir's hier einfach?
Besten Dank fürs Lesen der wall of text =)
Grüsse
slowy
Von vorne weg: Ich weiss, das ich wahrscheinlich nicht im richtigen Unterforum bin - aber finde leider kein geeignetes und fühle mich hier wohl am "heimischsten" *g* - falls wo besser aufgehoben, ungeniert verschieben =)
Von vorne weg 2: Hui, viel Text,... sorry =(
Zur Ausgangslage:
Bei neuen Webauftritten von uns müssen wir ein paar Webservices anbieten. Eine Funktionalität ist, dass bei einer Registrierung ein "activation code" generiert wird, welcher als Link per E-Mail verschickt wird. Der Benutzer klickt auf den Link und sein Account wird aktiviert. Diese Anforderung beinhaltet, dass wir das Datum speichern müssen, wann der Account aktiviert wurde.
Datenbankmässig würden wir's so lösen, dass wir eine Tabelle User und eine Tabelle Activation haben, die Activation hält den Foreign Key zur User-Tabelle. Soweit, so gut.
Nur, wo speichern wir das Aktivierungsdatum? Eher in der Usertabelle oder in der Activation-Tabelle? Weil dann muss man sich natürlich auch Gedanken über die Abfrage machen. Wir rechnen mit einigen Zehntausend Rows, über die man dann einen Select absetzt, der einen bis zu 64-stelligen Key (da wird weiter unten drauf eingegangen) sucht. Würde man das Aktivierungsdatum in der Tabelle Activation halten, könnte man hier wenigstens noch der Abfrage mitgeben, dass das Aktivierungsdatum null sein muss - hier rechnen wir natürlich mit viel weniger Rows (also weniger Benutzer, die ihren Account noch nicht aktiviert haben).... aber die Überlegungen gehen dann noch weiter ...
Dann haben wir uns die Frage gestellt, wie soll der Aktivierungscode aufgebaut, resp. generiert werden? Ich hätt jetzt mal behauptet, wir nehmen E-Mailadresse + ":" + Erstellungstimestamp und lassen nen SHA-256 drüberlaufen. Somit ist der Aktivierungscode reproduzierbar.
Dann ist uns eingefallen "Ja, moment mal. Wenn er reproduzierbar ist, warum speichern wir ihn dann überhaupt?" Nun, wenn wir ihn nicht speichern, bekommen wir nur mühsam wieder die Information raus, welchem Benutzer dieser Aktivierungskey gehört.
Dann kam die glorreiche Idee, den Primärschlüssel in der Aktivierungstabelle irgendwie in den Aktivierungscode zu bekommen. Also sieht's dann so aus "AKTIVIERUNGSCODE" + "PRIMARYKEY". Da haben wir natürlich den Riesenvorteil, dass wir die Abfrage auf den PK machen können. Dann haben wir den Aktivierungscode, von dort kommen wir an den User und können überprüfen, ob der übergebene Aktivierungscode mit dem übereinstimmt, was wir reproduzieren (also SHA-256(email + ":" + creationtimestamp).
Nur, wir schicken sicher keinen Primary Key in einem Aktivierungscode per E-Mail. Also könnte man ja z.B. den PK bei z.B. 1'000'000 beginnen und da drüber nen XOR drüber laufen lassen, welches man dann bei der Abfrage wieder "zurück-ver-XOR-en" müsste.
Also, dann würde das am Schluss so aussehen
Registrierung ->
Key Generieren -> SHA-256(email:creationtimestamp) + XOR(primary key Aktivierungstabelle, "Verschlüsselungskey")
Aktivierung ->
Substring Activation Code -> die ersten 64 Stellen sind der Hash, der Rest ist PK
-> den "Rest PK" zurück-x-oren
-> Select auf Aktivierung anhand des zurück-ge-x-orten-wertes (also vom effektiven PK), join auf User
-> Generierung des SHA-256-Hashs anhand der Benutzerdaten
-> Überprüfung der ersten 64 Stellen des Activation Keys mit dem, was wir anhand der Tabelle generiert haben.
So, nun, eben, eigentlich haben wir eine Lösung. Nur ist das ganze doch sehr aufwendung und komplex.
Wer von euch hat schon Erfahrungen damit gemacht, und wie habt ihr es gelöst?
Gibt's Fehler in unseren Überlegungen? Oder sind wir da komplett am Ziel vorbeigeschossen, resp. übertreiben wir's hier einfach?
Besten Dank fürs Lesen der wall of text =)
Grüsse
slowy