Verschlüsselte sqlite3.db unter Linux

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
sierdolg
Beiträge: 66
Registriert: Mi 24. Okt 2012, 15:50

Verschlüsselte sqlite3.db unter Linux

Beitrag von sierdolg »

Hallo beisammen,

nach längerer Recherche nach einer einfachen, aber funktionierenden Lösung, einer kleinen Lazarus-Anwendung unter Linux eine lokale Datenbankdatei zu spendieren, die allerdings verschlüsselt sein muß, hatte ich erst als vielversprechenden Ansatz das Demo von http://forum.lazarus.freepascal.org/ind ... ic=25124.0 ausprobiert. Dieses für Windows gedachte Demo, von dem ja auch eine Version als Beispielprojekt mit Lazarus installiert wird, läuft auch unter Linux mit einer kleinen Änderung bezüglich der Lib:
{$IFDEF UNIX}
//SQLiteLibraryName := '/usr/lib/x86_64-linux-gnu/libsqlite3.so';
//SQLiteLibraryName := '/usr/lib/x86_64-linux-gnu/libsqlcipher.so.0.8.6'; Fehler
//sqlite3dyn.SQLiteDefaultLibrary := '/usr/lib/x86_64-linux-gnu/libsqlite3.so' // ohne Verschlüssenung;
sqlite3dyn.SQLiteDefaultLibrary := '/usr/lib/x86_64-linux-gnu/libsqlcipher.so.0.8.6';
{$ENDIF}
{$IFDEF WINDOWS}// Windows
SQLiteLibraryName := 'sqlite3.dll';
{$ENDIF}
nur wird mit der "normalen" libsqlite3.so natürlich nur eine unverschlüsselte Datenbankdatei angelegt.

Nachdem http://forum.lazarus.freepascal.org/ind ... 006.0.html am Ende sqlcipher empfiehlt, habe ich es mit der libsqlcipher.so.0.8.6 aus dem entsprechenden Debian-Paket versucht. Damit kommt es nur zu einem "External: SIGSEGV". Ein weiterer Versuch mit der "/usr/lib/x86_64-linux-gnu/libwxsqlite3-3.0.so.0" (ebenfalls aus dem entsprechenden Debian-Paket) erbrachte ein lauffähiges Programm, aber leider wider Erwarten wieder nur unverschlüsselte sqlite-Files.

Um alles möglichst einfach zu halten, habe ich testweise ein leeres Projekt genommen, einen "Button1" und eine "ZConnection1" (ZEOSDBO-7.1.4-stable) aufs leere Formular gesetzt und folgendes versucht:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
const
  FILENAME = 'einTest.db';
  PASSWORD = 'iRgEnDwAs' ;
begin
  LazFileUtils.DeleteFileUTF8(FILENAME);
  ZConnection1.Protocol:= 'sqlite-3';
  ZConnection1.Database:= FILENAME;
  //ZConnection1.LibraryLocation:= '/usr/lib/x86_64-linux-gnu/libwxsqlite3-3.0.so.0';
  // funktioniert, aber ohne Verschlüsselung
  ZConnection1.LibraryLocation:= '/usr/lib/x86_64-linux-gnu/libsqlcipher.so.0.8.6';
  ZConnection1.Password := PASSWORD;
  ZConnection1.Connect;
  ZConnection1.ExecuteDirect('PRAGMA key = '''+PASSWORD+'''');
  ZConnection1.ExecuteDirect('PRAGMA cipher = ''aes-256-cfb''');
  ZConnection1.ExecuteDirect('CREATE TABLE hardware (id INTEGER PRIMARY KEY, compname VARCHAR(30), username VARCHAR(30), model VARCHAR(30))');
  ZConnection1.ExecuteDirect('CREATE INDEX sHardware ON hardware(compname)');
  ZConnection1.ExecuteDirect('INSERT INTO hardware(id, compname, username, model) VALUES (1, "AMD8537", "OMonge", "Gigabyte");');
  ZConnection1.Disconnect;
end;
 
 
Ich staunte nicht schlecht, als damit tatsächlich eine verschlüsselte Datei erstellt wurde! Als ich das heute an einem anderen Rechner (in beiden Fällen Debian Jessie, Lazarus 1.6 mit ZEOSDBO-7.1.4-stable) testen wollte, bekam ich wieder nur besagte "External: SIGSEGV".

Der Fehler tritt im Einzelschritt-Test in der Anweisung "ZConnection1.Connect" auf.
Da das Projekt mit einer anderen sqlite-Lib ja funktioniert, nehme ich an, daß das Problem innerhalb der "libsqlcipher.so.0.8.6" auftreten muß.

Somit bleibt die Frage für mich leider offen: Wie kann man unter Linux eine funktionierende verschlüsselte Datenbankdatei (es muß nicht mal zwingend sqlite sein, sollte halt nur irgendwie SQL ermöglichen und open source sein) am besten realisieren? Vielleicht hat hier ja jemand einen Tip oder, noch besser, ein funktionierendes Minimalbeispiel?

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Verschlüsselte sqlite3.db unter Linux

Beitrag von Soner »

Mormot von Synopse http://synopse.info/fossil/wiki/Synopse+OpenSource soll laut Handbuch auch verschlüsselte Sqlite-Db verwenden. Das gute dabei ist, dass Sqlite im Programm integriert ist, also keine DLLs.
Nachzulesen bei http://synopse.info/files/html/Synopse%20mORMot%20Framework%20SAD%201.18.html#TITLE_128
"...
Can be either statically linked to the executable, or load external sqlite3.dll;
...
Optional direct encryption of the data on the disk (up to AES256 level, that is Top-Secret security);
.."

Antworten