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;
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?