SQLite Datenbank Struktur

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Hallo,
ich habe auf euren Rat, aus meinem letzten Thread, jetzt eine normalisierte SQLite Datenbank. Jetzt wollte ich fragen wie ihr die Struktur findet und ggf. Verbesserungvorschläge habt?
Das Programm von dem die Datenbank ausgelesen wird hat mehrere Nutzer wovon jeder eine eigene ID besitzt. Ich will alle Messsdaten in die selbe Tabelle schreiben und dann beim auslesen dem Nutzer nur die Messsdaten von den Stationen anzeigen, die ihm gehören. Ist dafür die Datenbankstruktur geeignet?

werttyp: id | name

messstationen: id | name | owner_id

messung: id | messstation_id | werttyp_id | timestamp | wert
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

'owner_id' in der zweiten Tabelle klingt jetzt irgendwie so, als gäbe es auch noch eine Owner-Tabelle, die fehlt. Oder werden Benutzer einfach nur über eine ID unterschieden?
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Das ist viel mehr die Nutzer Tabelle welche allerdings in der Nutzerdatenbank liegt. Jeder Nutzer hat wie schon gesagt eine eigene ID und wenn er jetzt eine neue Station erstellt wird diese als owner_id mit abgespeichert.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum denn zwei Datenbanken?
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Das eine Soll ja eine Große Datenbank mit den Messdaten werden. Und das andere dachte ich wird eine kleine wo die Benutzer drin sind die eigentlich nur zum Login gebraucht wird. Ist das so nicht sinnvoll das ganze abzugrenzen?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Im Gegenteil. Das macht es nur komplizierter & fehleranfälliger.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Oke also ich soll meine Benutzer in der selben Datenbank eine Tabelle anlegen. Die user Tabelle hat übrigens diese Struktur. Gibt es noch andere Verbesserungsvorschläge oder Kritik?

Das Passwort wird als hash abgespeichert.
user: name | password | id
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hash ist gut, aber ohne Salt nicht gut genug. Kannst du mal googeln was das bedeutet. Und ich persönlich stelle due id immer ganz nach vorne, ist aber reine Ästhetik.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Ist das hier oke?

Code: Alles auswählen

def hash_password(password):
    # uuid is used to generate a random number
    salt = uuid.uuid4().hex
    return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Hypec hat geschrieben: Dienstag 28. Mai 2019, 18:17 Ist das hier oke?
Leider nicht. Wenn du jedes mal einen neuen, zufälligen Salt erzeugst, den du dir nirgendwo merkst, hast du ja keine Möglichkeit, die Passwörter später zu prüfen. In der Praxis sehe ich bei Webanwendungen meistens, dass irgendwo in einer Config-Datei ein fester, zufällig erzeugter Wert steht, der als Salt verwendet wird. Man kann auch für jeden Benutzer einen individuellen Salt generieren, den man sich zusätzlich merkt. In dem Fall nimmt man dann ggf. noch zusätzlich einen festen Wert aus einer Config-Datei hinzu.

Wenn beide Programme, von denen die Rede war, von dir sind und du nicht die Datenbank einer dritten Software anzapfst, würde ich, wie __deets__ ebenfalls vorgeschlagen hat, alles in eine Datenbank packen.
Zuletzt geändert von nezzcarth am Dienstag 28. Mai 2019, 18:42, insgesamt 1-mal geändert.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Komisch eigentlich klappt es mit dieser Funktion die Passwörter wieder richtig darauß auszulesen.

Code: Alles auswählen

def check_password(hashed_password, user_password):
    password, salt = hashed_password.split(':')
    return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest()
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Du hast recht. Ich habe nicht richtig geschaut; du merkst dir den Salt als Teil des Hashs. Das sollte gegen Rainbowtables schon reichen; mache ich nur selbst nie so.
Zuletzt geändert von nezzcarth am Dienstag 28. Mai 2019, 19:01, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

So macht es ja auch passwd, finde ich völlig ok.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Also das passt also.
Wie ist der Rest von der Datenbankstruktur?
Antworten