Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   SQLite iOS encrypt password klappt nicht (https://www.delphipraxis.net/178745-sqlite-ios-encrypt-password-klappt-nicht.html)

schotti65 24. Jan 2014 21:21

SQLite iOS encrypt password klappt nicht
 
Ich verwende eine SQLite Datenbank.
Das "Backend" (Windows VCL) pflegt diese, die iOS-App (FMX mobile) (iPad iOS7) liest diese.
Die *.sdb für die App wird beim deployen mitverteilt und später via FTP aktualisiert.
Alles hat im Prinzip schon funktioniert.

Jetzt habe ich die *.sdb verschlüsselt, im Backend unter Windows:
Delphi-Quellcode:
  FDSQLiteSecurity1.Database := FDConnection1.Params.Values['Database'];
  FDSQLiteSecurity1.Password := constCryptDatabasePassword;
  FDSQLiteSecurity1.SetPassword;
Im Backend alles schön, das Öffnen geht danach wie folgt:
Delphi-Quellcode:
function openDb(cPath : string; db : TFDConnection) : boolean;
begin
  if cPath <> '' then begin
    db.Params.Values['Database'] := cPath;
  end;

  db.Params.Values['LockingMode'] := 'normal';
  db.Params.Values['Password'] := constCryptDatabasePassword; // ohne diese Zeile hatte alles funktioniert...

  db.Connected := true;

  ...

  result := true;
end;
Im Backend geht das auch wunderbar.
ABER in der App kommt die Fehlermeldung

"...file is encrypted or is not a database"

Als Gegenprobe habe ich die PW-Konstante geändert und bekomme dann im Backend "...invalid password is specified or db is corrupted".
In der App wie oben.
(D.h. in der App wird das PW nicht falsch interpretiert (könnte ja sein, das iOS automatisch ein "aesXYZ-" davor setzt o.ä.) - denn dann käme ja auch in der App diese Fehlermeldung, sondern einfach nicht beachtet)

Der obige Code zum Öffnen wird gleichermassen von der App und vom Backend benutzt.
(Ich hab also keinen Schreibfehler gemacht)

Es ist, als ob die SQLite-Bibliothek (sagt man unter iOS so?) sich gar nicht für den Parameter "Password" interessieren würde... ("password" mit kleinem "p" hab ich auch probiert)

Hat jemand eine Idee?

PS: in der Doku http://docwiki.embarcadero.com/RADSt...te_mit_FireDAC liest sich das für mich so, als ob "Password" unter iOS auch funzen sollte...

Darlo 24. Jan 2014 23:07

AW: SQLite iOS encrypt password klappt nicht
 
Der Mist ist, dass es mobil nicht unterstützt wird...
Ärgert mich extrem!

schotti65 25. Jan 2014 09:39

AW: SQLite iOS encrypt password klappt nicht
 
Wie kommst Du denn darauf, kannst Du das etwas präzisieren?

Ich hab jetzt in alle möglichen Richtungen (apple embarcadero anydac) gesucht und nirgendwo eine definitive Aussage gefunden.

Darlo 25. Jan 2014 13:16

AW: SQLite iOS encrypt password klappt nicht
 
Erkenntnis vom 02.09.2013:

Frage von mir:
Zitat:

Am 30.08.2013 um 11:39 schrieb x


Hallo Herr Y,

vielen Dank für Ihre Antwort. Das SQLiteSecurity Ding funktioniert unter Windows problemlos. Nur unter iOS wird es nicht ausgeführt….

Über eine Rückmeldung ob ich mich nur anstelle, oder diese Funktion unter iOS nicht funktioniert wäre ich Ihnen sehr dankbar.

Delphi-Quellcode:
procedure TForm1.ADConnection1AfterConnect(Sender: TObject);
begin
  adQuery1.SQL.Text := 'CREATE TABLE IF NOT EXISTS whatEver( '+
    'dsid                 varchar(50) NOT NULL,'+
    'pid                  varchar(50) NOT NULL,'+
    'kurzfristig          varchar(128),'+
    'mittelfristig        varchar(128),'+
    'langfristig          varchar(128),'+
    'datumLetzte          date,'+
    'inhaltLetzte         text,'+
    'vonWemLetzteg        varchar(50),'+
    'personen_nr          integer,'+
    'PRIMARY KEY (dsid, pid))';
  adQuery1.ExecSQL;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  adConnection1.Connected := true;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  showmessage(ADSQLiteSecurity1.CheckEncryption);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  ADSQLiteSecurity1.SetPassword();
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  adConnection1.Connected := false;
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  {$IFDEF iOS}
  adConnection1.Params.Values['Database'] := GetHomePath + PathDelim +
      'Documents' + PathDelim + 'db1.sqlite';
  {$else}
    adConnection1.Params.Values['Database'] := ExtractFileDir(ParamStr(0))+'db1.sqlite';
  {$ENDIF}
 
  ADSQLiteSecurity1.DriverLink := ADPhysSQLiteDriverLink1;
  ADSQLiteSecurity1.Database := adConnection1.Params.Values['Database'];
  ADSQLiteSecurity1.Password := 'TEST_12345';
end;

Antwort von Emba:
Zitat:

Hallo Herr x,

in der Tat, wie befürchtet:

SQLite Verschlüsselung nur auf iOS. //Kommentar: Das nur auf iOS bezieht sich wohl darauf, dass es nur unter iOS nicht geht

Also müssten Sie sich nach Alternativen umschauen…. UniDAC, LiteDAC

Best regards,
Mit freundlichen Grüßen

y


Embarcadero Germany GmbH | www.embarcadero.com/de



schotti65 25. Jan 2014 16:31

AW: SQLite iOS encrypt password klappt nicht
 
Aha.
Ich bin parallel auf anderem Weg zu derselben Erkenntnis gekommen.
FireDac ist ja wohl nichts anderes als das seit XE4 inkorporierte AnyDac von DA-Soft (http://www.da-soft.com/).
Die hab ich gefragt und die folgende Antwort bekommen:

"Hello ... SQLite encryption is supported only on Windows.
--
With best regards,
Dmitry Arefiev / FireDAC Architect
FireDAC - Firebird, SQLite, MySQL, SQL Server, Oracle, PostgreSQL,
DB2, SQL Anywhere, Access, Informix, ODBC high-speed data access lib"

Das ist doof.
Und noch doofer ist, das im Emba-Wiki (http://docwiki.embarcadero.com/RADSt...anken_(FireDAC)) nicht darauf hingewiesen wird.
Ein Absatz über der ganzen Verschlüsselungsgeschichte wird noch OS-X und iOS aufgelistet.

Das könnte ein Querlesender ruhig mal einpflegen...

Darlo 25. Jan 2014 17:49

AW: SQLite iOS encrypt password klappt nicht
 
Und Interbase toGo kann das zwar, kostet aber pro Client Lizenzgebühren im unterem 2 stelligen Bereich, völlig inakzeptabel. So kann man preislich im AppStore nicht mithalten

schotti65 26. Jan 2014 12:47

AW: SQLite iOS encrypt password klappt nicht
 
Nur so als Abschluss, falls jemand die gleiche Randbedingung "App braucht nur lesen" (<=> Datenaustausch in eine Richtung reicht aus) haben sollte, ich hab's jetzt mit SQLite folgendermassen gelöst:

- Backend erstellt + verschlüsselt periodisch eine Textdatei, die alle SQL-Anweisungen zum kompletten erstellen der DB enthält (create insert usw.)
- Textdatei wird on demand via FTP bei der App aktualisiert
- App liest bzw. entschlüsselt die Textdatei jedes Mal bei Start und erzeugt dann die komplette DB im Speicher (database=":memory:").
Damit ist auf dem iOS Gerät anstelle der nicht-verschlüsselbaren SDB nur eine verschlüsselte Textdatei.

Klappt, bis jetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz