Verschlüsselung
Jede Datenbank kann verschlüsselt werden, dies bleibt dem Benutzer aber freigestellt.
Eine Sammlung von Webseiten aller deutschen Tageszeitungen z.B. muss eher nicht verschlüsselt werden, wenn aber Anmeldedaten hinzukommen (Benutzernamen und Passwörter), dann ist dies empfehlenswert und wird von Mahaf in den Standarteinstellungen auch verlangt.
Wenn eine Datenbank verschlüsselt ist, dann gilt das immer für alle Informationen in ihr - nicht nur die Passworte.
Nur der Header der Datenbank, die ersten 5 Zeilen, ist hiervon ausgenommen.
Zum Hashen und Verschlüsseln werden jeweils Algorithmen benutzt, die gut bekannt/analysiert und schon lange im Einsatz sind und von verschiedenen Seiten empfohlen werden.
Es handelt sich bei dem Verschlüsselungsalgorithmus um den 128 Bits Blockshiffre Twofish mit einer Schlüssellänge von 256 Bits (CBC block ciper mode).
Hashes werden mit dem Hashalgorithmus Haval erzeugt, ebenfalls mit einer Länge von 256 Bits.
Hashen
Das Passwort, dass der Benutzer eingibt, wird, bevor es für die Verschlüsselung verwendet wird, zusammen mit einem Salt per Haval (256 Bits) gehasht (Hash[Passwort + Salt]).
Durch das Salting (Salt: zufällig generierter String, gespeichert im Datenbankheader) wird verhindert, dass ein Angreifer Wörterbücher mit vorberechneten Hashes für eine Wörterbuchattacke verwenden kann.
Da sich der Salt von Datenbank zu Datenbank ändert, müsste für jeden Angriff eine neue Hashtabelle aufgebaut werden, das vergrössert den zeitlichen Aufwand erheblich.
Es besteht die Möglichkeit, alternativ oder zusätzlich zur Vergabe eines Kennworts ein KeyFile zu verwenden. Hierfür kann jede beliebige Datei genutzt werden.
Der Hash (Haval 256) der gewählten Datei plus den Salt ist dann der Schlüssel der Datenbank (Hash[Datei + Salt]).
Werden KeyFile und Passwort gleichzeitig benutzt, dann wird der Schlüssel wie folgt ermittelt: Hash[Hash[Datei] + Passwort + Salt].
Erstellen von zufälligen Schlüsseln
An verschiedenen Stellen werden zufällig generierte Schlüssel benötigt.
Im Einzelnen sind das:
- Session-Key (berechnet beim Laden einer Datenbank)
- Database-Key (individuell für jede Datenbank)
- Salt (individuell für jede Datenbank)
Zu deren Berechnung werden mehrere pseudo-zufällige Werte herangezogen:
- Mauskoordinaten
- Fensterposition (Position der Anwendung auf dem Bildschirm)
- GetTickCount (Sekunden seit Systemstart)
- GetCurrentTread (Tread-ID)
- GetCurrentProcess (Prozess-ID)
- GetPriorityClass (Prozess-Priorität)
- GetThreadPriority (Tread-Priorität)
- CPU-Auslastung (zukünftig)
- Speicherauslastung (zukünftig)
- Zufallszahl (0 - 5000)
Diese Werte werden per Haval (256 Bits) gehasht und bilden so die benötigten Schlüssel.
Wörterbuch- und Bruthforce Attacken
Es gibt grundsätzlich kein Mittel um einen Angreifer davon abzuhalten, schlicht alle möglichen Passwörter auszuprobieren. Über kurz oder lang wird er Erfolg haben.
Das Einzige was man hier tun kann und auch tun sollte ist, die Zeit zu verlängern, die hierfür benötigt wird.
Einen bedeutenden Teil hierzu kann der Benutzer selber beitragen, indem er unter keinen Umständen Passworte benutzt, die in irgend einem Wörterbuch stehe, sowie keine Namen oder Dinge aus seinem privatem Umfeld. Sowas probiert jeder als erstes um ein Passwort zu knacken.
Mahaf sorgt dann noch für den Rest:
Um den entgültigen 256-bit Schlüssel zu erzeugen, der dann zur Verschlüsselung der Daten benutzt wird, geht Mahaf folgendermaßen vor:
- Salting: das vom Anwender eingegebene Passwort wird zusammen mit dem Salt (und ggf. dem Hash einer Datei) per Haval (256 Bits) gehasht
- Stretching: das Ergebnis wird (per default) 8000 mal per Twofish verschlüsselt (mit dem Database-Key) und jedes mal erneut gehasht (Haval 256 Bits).
Da die Twofish-Verschlüsselung nicht vorausberechenbar ist, müsste ein Angreifer jetzt auch bei jedem seiner Versuche sein Passwort 8000 mal verschlüsseln, bevor er probieren kann, ob sich die Datenbank mit diesem Passwort öffnen lässt.
Das verlangsamt ihn erheblich (daher der Name Stretching von to stretch -> strecken), denn wenn es ihn pro Versuch auch nur eine halbe Sekunde kostet, kann er jede Passwortattacke vergessen, sie würde Monate wenn nicht sogar Jahre dauern.
Der Database-Key sowie der Salt werden im Datenbankheader gespeichert, dort steht auch die Anzahl der Verschlüsselungsrunden (der Defaultwert ist hier 8000).
Der Defaultwert von 8000 Verschlüsselungsrunden ist so niedrig angesetzt, dass es auf heute üblichen PCs zu keinen nennenswerten Verzögerungen beim Öffnen einer Datenbank kommen sollte.
Der Wert kann über die Einstellungen angepasst werden. Schon verschlüsselte Datenbanken werden dabei aber nicht automatisch angepasst!
Um das zu erreiche muss bei jeder Datenbank die Verschlüsselung aufgehoben und danach erneut eingerichtet werden oder man fürt schlicht eine Änderung des Passworts durch.
Passwörter im Speicher verschlüsseln
Die Daten einer geladenen Datenbank liegen im Speicher des Prozesses der Anwendung.
Dadurch besteht grundsätzlich die Möglichkeit, dass jemand ein Abbild dieses Speichers erstellt und dadurch die Passworte auslesen kann.
In zukünftigen Versionen von Mahaf werden diese (aus Performancegründen nur das Passwortfeld) dann auch nur noch Verschlüsselt abgelegt und erst im Zugriffsfall entschlüsselt, hierfür ist der Session-Key vorgesehen.
Automatisches Freigeben der Datenbanken
Jede verschlüsselte Datenbank, die in die Systray verkleinert ist, wird den Standarteinstellungen entsprechend nach 30 Sekunden automatisch geschlossen.
Wenn eine Datenbank freigegeben wird, sei es automatisch oder auf Kommando, dann wird diese gespeichert und vollständig aus dem Speicher entfernt. Daher muss sie danach ggf. wieder geöffnet werden. Mahaf merkt sich hier die zuletzt geöffnete Datenbabk und die markierte Kategory.