# Datenbank sichern



## Lucaaa (15. Sep 2018)

Hallo!
Mein Programm soll Daten in einer Datenbank speichern. (Passwörter, Kreditkarteninfos...) (Nein, ich kann die Passwörter nicht als Hash speichern, da ich diese noch anzeigen muss).
(Die Datenbank ist lokal gespeichert (kein SQL server usw.)

Meine Frage ist nun, wie ich die Daten am besten Schütze?
- entweder die einzelnen Daten vor dem schreiben verschlüsseln und vor dem anzeigen entschlüsseln ?
- oder einfach die ganze Datei byte für byte entschlüsseln. (Obwohl das eher unpraktisch wäre, da ich die unverschlüsselte Datei dann zwischenspeichern müsste)
- oder gibt es da noch eine dritte Variante? (ich nutze sqllite, könnte das aber wenn notwendig ändern)

Ich würde das ganze gern mit einem Passwort machen, das beim Start meines Programms eingegeben werden muss. (Also kein gespeicherter Key). Wie speichere ich dieses Passwort am sichersten zwischen? einfach in einer Variable? oder irgendwie anders?

Danke schonmal für eure Hilfe


----------



## Thallius (16. Sep 2018)

Ganz einfach. Das Passwort was am Anfang eingegeben werden muss wird natürlich nur als Hash gespeichert um den Login abzugleichen. Das darf niemals in wie auch immer gecrypteter Form gespeichert werden. 
Dieses Passwort benutzt du nun als Secret key zum encrypten der anderen Passwörter mit welchem Algorytmus auch immer gerade der aktuell beste und sicherste ist.

Gruß

Claus


----------



## Lucaaa (16. Sep 2018)

Thallius hat gesagt.:


> Dieses Passwort benutzt du nun als Secret key zum encrypten der anderen Passwörter


Das mit dem als Hash gespeichertem Passwort war mir schon klar .
Die Frage ist nun wie ich die Datenbank damit sichere.
Soll ich einfach jeden Datensatz vor dem Schreiben ver- und vor dem anzeigen entschlüsseln, (So hab ich das bisher immer mit Textdateien gemacht) oder gibt es eine Möglichkeit die gesamte Datenbank zu sichern? insbesondere wenn es darum geht, das Passwort auch wieder zu ändern (Oder die Entsperrung durch Fingerabdruck zu ermöglichenk…)


----------



## Thallius (16. Sep 2018)

Die ganze DB zu verschlüsseln macht doch überhaupt keine Sinn. Willst du vor jedem Query die ganze Datenbank entschlüsseln und danach wieder verschlüsseln?  Vor allem weist du je nach DB ja gar nicht welche Dateien dazu gehören.

MySQL. MariaDB und andere bieten für sowas auch schon fertiges an

https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html

Da Must du gar nichts selber machen.

Noch einfacher ist es einfach eine verschlüsselte Festplatte als Speichermedium zu nehmen. Das bietet eigentlich auch jedes OS heute von Hause aus an. Aber darauf hast du keinen Einfluss wenn du Software für andere entwickelst.

Gruß

Claus


----------



## mihe7 (16. Sep 2018)

https://www.sqlite.org/see/doc/trunk/www/readme.wiki


----------



## Lucaaa (16. Sep 2018)

Thallius hat gesagt.:


> Noch einfacher ist es einfach eine verschlüsselte Festplatte als Speichermedium zu nehmen. Das bietet eigentlich auch jedes OS heute von Hause aus an. Aber darauf hast du keinen Einfluss wenn du Software für andere entwickelst.


Also werden nur die einzelnen Datensätze verschlüsselt gespeichert - Gut. 
Verschlüsselte Festplatte ist in sofern nicht geeignet, da ich die Datenbank exportieren lassen können will. D.h. ein User kann reinschreiben, und ein anderer lesen (Oder derselbe (Backup)). Kann ich denn dann auch mit diesem SQL sicherungsdings das Passwort ändern, bzw. mit Fingerabdruck entschlüsseln?


----------



## mihe7 (16. Sep 2018)

Lucaaa hat gesagt.:


> Also werden nur die einzelnen Datensätze verschlüsselt gespeichert


Zumindest bei SEE werden Seiten verschlüsselt. Bei MySQL InnoDB Tablespace Encryption das ganze Tablespace, wobei ich auf die Schnelle nicht finden konnte, wie genau das zu verstehen ist. Hier bleiben die Logs im Gegensatz zu SEE unverschlüsselt.



Lucaaa hat gesagt.:


> Kann ich denn dann auch mit diesem SQL sicherungsdings das Passwort ändern, bzw. mit Fingerabdruck entschlüsseln?


Passwort ändern: ja. Bei SEE s. Abschnitt "Changing the encryption key", bei MySQL steht das im ersten Absatz: "The decrypted version of a tablespace key never changes, but the master encryption key can be changed as required. This action is referred to as _master key rotation_."

Fingerabdruck: das Problem ist die reproduzierbare Ermittlung der biometrischen Daten. Hier wird i.d.R. eine DB benötigt, die ihrerseits verschlüsselt sein muss...


----------



## Lucaaa (16. Sep 2018)

mihe7 hat gesagt.:


> Fingerabdruck: das Problem ist die reproduzierbare Ermittlung der biometrischen Daten. Hier wird i.d.R. eine DB benötigt, die ihrerseits verschlüsselt sein muss...


Ich hatte da an dem Im Smartphone gespeicherten Fingerabdruck gedacht. Wie beim entsperren des Bildschirms, oder Apps wie "Passwordmanager - safeincloud" oder so ähnlich. Weißt du vielleicht wie das da gemacht wird?
https://play.google.com/store/apps/details?id=com.safeincloud


----------



## mihe7 (16. Sep 2018)

https://medium.com/beautycoder/android-security-and-fingerprint-ef0f6f344888


----------

