@meego: Ich würde mal sagen das funktioniert so nicht. Schreib doch mal ein paar konkrete Datensätze auf ein Blatt Papier (oder in eine Textdatei) mit sagen wir mal zwei Benutzern die sich gegenseitig ein paar Nachrichten geschickt haben.
jeder User kann N Messages schicken und jede Message hat genau einen (1) User (=Absender) und einen (?) Empfänger. Das spiegelt dein Entwurf nicht wieder.
@meego:
fast richtig - das `id_messages = Column(Integer, ForeignKey('message.id'))` in User macht keinen Sinn, statt dessen ist es sinnvoll, in User 2 (Rück-)Relationen anzulegen - eine für empfangene und eine für gesendete Nachrichten.
jerch hat geschrieben:@meego:
fast richtig - das `id_messages = Column(Integer, ForeignKey('message.id'))` in User macht keinen Sinn, statt dessen ist es sinnvoll, in User 2 (Rück-)Relationen anzulegen - eine für empfangene und eine für gesendete Nachrichten.
Kannst du das mit der Rückrelation noch etwas ausführen? Was soll da konkret stehen?
EMail Addressen können 254 Zeichen lang sein. Password hash und Salt sollten zusammen in einem String sein, so verhalten sich zumindest alle Hashing Algorithmen die man nutzen kann um sicher Passwörter zu speichern.
Du siehst, es besteht aus mehreren Teilen: Hash-Algorithmus, Iterationen, Salt, Passwort.
Das hat den Vorteil, dass man das Verfahren austauschen kann, um es sicherer zu machen, ohne dass alle Nutzer ihre Passwörter neu eingeben müssen.
meego hat geschrieben:@DasIch: Merci. Aber woher soll der User (bzw. meine Application) beim einloggen den Salt nehmen, wenn er nicht in der Tabelle abgelegt ist?
Der Salt wird schon in der Tabelle abgelegt bloß nicht in einer eigenen Spalte. Davon abgesehen gibt es ja noch mehr als nur Hash und Salt, wie z.B. Kostenfaktoren. Aufgrund der großen Unterschiede zwischen existierenden Algorithmen und solchen die noch kommen werden macht es keinen Sinn auf soetwas im Datenbankschema einzugehen.
Also nur ein Feld, wo hinter dem Hash der Salt einfach angehängt und auch von dort ausgelesen wird?
Da stellt sich die Frage, wie die empfohlene Tabelle für Facebook-Logins: remote_source_users (user_id:integer, remote_source_id:string, remote_source:string)
mit meiner users Tabelle zu verknüpfen ist. Wenn sich einer über FB anmeldet wird in remote_source_users ein Datensatz erstellt, aber was passiert in Users? Mir ist das Prinzip nicht ganz klar.
Du siehst, es besteht aus mehreren Teilen: Hash-Algorithmus, Iterationen, Salt, Passwort.
Das hat den Vorteil, dass man das Verfahren austauschen kann, um es sicherer zu machen, ohne dass alle Nutzer ihre Passwörter neu eingeben müssen.
Da fehlt mir der kryptographische Kennerblick.
Aber warum müssten die Benutzer bei zwei Feldern das Passwort neu eingeben?
@meego: Du hast in Deinem Design nicht vorgesehen, dass sich der Hash-Algorithmus ändern kann. Vielleicht gibt es andere Algorithmen, die andere Parameter brauchen. Kurz, Dein Design ist unnötig kompliziert und unflexibel.
Sirius3 hat geschrieben:@meego: Du hast in Deinem Design nicht vorgesehen, dass sich der Hash-Algorithmus ändern kann. Vielleicht gibt es andere Algorithmen, die andere Parameter brauchen. Kurz, Dein Design ist unnötig kompliziert und unflexibel.
meego hat geschrieben:...
Da fehlt mir der kryptographische Kennerblick.
Aber warum müssten die Benutzer bei zwei Feldern das Passwort neu eingeben?
Wenn Du Dich damit nicht auskennst, spricht das ganz stark dafür, was Fertiges zu nehmen. Das Problem ist schon zigmal vor Dir gelöst und auf Fehler abgeklopft worden, z.B. in Django
jerch hat geschrieben:Wenn Du Dich damit nicht auskennst, spricht das ganz stark dafür, was Fertiges zu nehmen. Das Problem ist schon zigmal vor Dir gelöst und auf Fehler abgeklopft worden, z.B. in Django
meego hat geschrieben:Was ist "was Fertiges"? Eine Bibliothek?
Ja - bzw. ein fertiges Framework wie Django. Das hat die Benutzerverwaltung inkl. Gruppen, zugehöriger Methoden und Dekoratoren bereits an Bord. Und das ganze dann auch noch integriert mit einem ORM, Template Engine, Form Framework, URL-Routing usw usw