SQLite i hasło do bazy

0

Cześć. Zainstalowałem sobie DB Browser (SQLite) i stworzyłem bazę SQLite. Czy mogę nadać hasło do bazy bo jest bardzo potrzebne aby nikt nie odczytał danych? Robię program delphi do haseł internetowych i baza musi być zaszyfrowana z loginem i hasłem. Myślałem nad MySQL ale nie chcę się łączyć co chwila lokalnie. Nie chcę zmieniać bazy na razie bo wszystko już prawie działa bez hasła. Program DB Browser (SQLite) bez problemu wchodzi i wychodzi z bazy. Tak nie może być.
Jeśli zmienić bazę to wtedy tylko gdy nie będzie zbytnio dużo poprawek w programie. Bo są tam jeszcze inne rozszerzenia *.sdb w komponencie FDConnection1. Nie wiem czy to jest właśnie to. Jeśli nie ma rozwiązania darmowego to może być płatne.

1

Bardzo dawno temu jak to jeszcze był anydac działało coś takiego:

  a_Database := TADConnection.Create(application);
  a_Database.Params.Add(format('Database=%s',[ p_file]));  
  a_Database.Params.Add('DriverID=SQLite');  
  if p_encrypt then
  begin
    a_Database.Params.Add('Encrypt=aes-128');
    a_Database.Params.Add('password=aaaa');
  end;

Po aktuzlizacji do TFDConnection to juz nie sprawdzilem

0

Nie mam przekonania - choć wypowiadam się jako nie-specjalista - że baza + hasło jest właściwym fundamentem projektu jednak wysokiej kryptografii, przechowywarki haseł.

To nigdy nie było / nie jest audytowane co do niezawodności / pewności tego zabezpieczenia
Wydaje mi się, ze w necie dzieciaki znajdą toole to łąmania / odtworzenia tego hasła (nie szukałem, ale stawiam 80% że jest)

Gdybym to robił, pewnie bym wyprodukował do zawartości tekstowej (w RAM - jeszcze nie pliku) jakiś XML / CSV / JSON i zaszyfrował algorytmem, który ma gwarantowaną siłę matematyczną.
Kiedyś miałem w rękach dwustronny Blowfish, obszerna dziedzina szyfrów jednostronnych ... duża dziedzina, i w tym bym widział pewność

0

ok mam kod po przejści na link od KamilAdam

SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.Open();

Ale gdzie go wprowadzić? Bo to ani kod Delphi ani SQL

Adamek Adam co to jest za typ zmiennej a_Database. Spróbuje może tak zadziałać na bazę.

0

ten kod także nie działa
ATTACH 'D:\tmp\test.db' AS tst KEY 'password'

1

Jeszcze klient sqlite musi to obsługiwać. Parę lat temu jak testowałem to na androidzie to androidowy klient nie obsługiwał hasła na sqlite.
Inna sprawa, że w sqlite hasło nie działa jak w innych "pełnych" bazach - tutaj to nie jest hasło do połączenia ale klucz, którym szyfrują się wszystkie dane - sqlite to baza do której fizyczny dostęp ma każdy więc hasło do połączenia nie zadziała.

0
abrakadaber napisał(a):

więc hasło do połączenia nie zadziała.

Wiesz może jak to ustawić? Może jakaś inna baza. Pobawiłem się wczoraj także szyfrowaniem samych haseł. Są użytkownicy komputera i do nich są tworzone tabele z hasłami. Wszystkie hasła te, które się loguje na początku i te które dodaje wraz z stronami są szyfrowane. Może nie warto zabezpieczać bazy hasłem głównym. Znalazłem stronkę https://www.sqlite.org/see/doc/release/www/index.wiki, ale nie wiem jak tego użyć. Testuje aktualnie DBGrida wraz z przyciskami DBNavigator1 ale tak średnio to działa bo jest problem z przeszukaniem rekordów powtarzających się po dodaniu loginu. Może ktoś jeszcze wpadnie na jakiś pomysł...

0

@pawelo31 Napisz może parę słów o tym co chcesz finalnie uzyskać.

Zacznij może od przeczytania tego https://www.sqlite.org/see/doc/release/www/readme.wiki

W Delphi w komponencie Firedac/Anydac jest wkompilowana wersja z wbudowanym szyfrowaniem dlatego można to włączyć
Jak uzyjesz np. "DB Browser (SQLite) " to tam jest standardowy DLL i o żadnym szyfrowaniu nie ma mowy

Chcesz użyć szyfrowania musisz mieć odpowiednio zbudowany sqlite

0
Adamek Adam napisał(a):

@pawelo31 Napisz może parę słów o tym co chcesz finalnie uzyskać.

Zacznij może od przeczytania tego https://www.sqlite.org/see/doc/release/www/readme.wiki

Tak ale nie wiem jak tego użyć. Bo jak później podać hasło do łączenia w delphi. Daje sobie spokój chyba. To musi być łatwe do zaimplementowania.

0

W pierwszym poście wspomniałeś o "FDConnection1"
wiec założyłem wstępnie że choć trochę znasz FireDac-a

Z takim gotowym kawałkiem kodu sobie poradzisz

var
  a_Database: TFDConnection; // polaczenie 
  p_encrypt:boolean; // czy szyfrowac sqlite
  p_file: string; // nazwa pliku bazy danych 

  a_Database := TFDConnection.Create(application);
  a_Database.Params.Add(format('Database=%s',[ p_file]));  
  a_Database.Params.Add('DriverID=SQLite');  
  if p_encrypt then
  begin
    a_Database.Params.Add('Encrypt=aes-128');
    a_Database.Params.Add('password=aaaa');
  end;

chcesz uzyc Delphi czy pytasz ogolnie o SqLite ?

0

Chcę połączyć bazę SQLite z delphi. Już ulepszam ten program. Adamek Adam spróbuje wstawić ten kod.

0

Nie działa to

function nadaj_haslo(): string;
var
  a_Database: TFDConnection; // polaczenie
  p_encrypt:boolean; // czy szyfrowac sqlite
  p_file: string; // nazwa pliku bazy danych
  begin
  p_file := ExtractFilePath(Application.ExeName) + '\baza\simple_password.db';

  if FileExists(p_file) then begin
  a_Database := TFDConnection.Create(application);
  a_Database.Params.Add(format('Database=%s',[ p_file]));
  a_Database.Params.Add('DriverID=SQLite');
  if p_encrypt then
  begin
    a_Database.Params.Add('Encrypt=aes-128');
    a_Database.Params.Add('password=aaaa');
  end;
  end;
end;

Normalnie wchodzę i wychodzę później z bazy

1

Trochę krajanka ale działa na Delphi 2010 i 10.4 64bit

plik db.db otwieram bez hasla
plik db_encrypt.db z haslem
pliki wygladaja binarnie zupelnie inaczej i zaden program nie odczyta db_encrypt.db

object Form19: TForm19
  Left = 0
  Top = 0
  Caption = 'Form19'
  ClientHeight = 299
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 136
    Top = 104
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
end
unit Unit19;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm19 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form19: TForm19;

implementation

{$R *.dfm}


{$if CompilerVersion > 22} // D2010
uses FireDAC.Comp.Client, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error,FireDAC.UI.Intf,
  FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys,  FireDAC.Stan.ExprFuncs,
  FireDAC.Phys.SQLite, FireDAC.Stan.Param,FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.VCLUI.Wait,
  FireDAC.Phys.Intf, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.Moni.Base,
  FireDAC.Phys.SQLiteWrapper;

type
  TU32_Query = TFDQuery;
  TU32_CustomQuery= TFDCustomQuery;
  TU32_Connection = TFDConnection;
  TU32_CustomConnection = TFDCustomConnection;
  TU32_ESQLiteNativeException = ESQLiteNativeException;
  TU32_TADTable  = TFDTable;
  TU32_AutoIncField = TFDAutoIncField;
{$else}
uses uADCompClient, uADStanIntf, uADStanOption, uADStanError,uADGUIxIntf,
  uADStanDef, uADStanPool, uADStanAsync, uADPhysManager,  uADStanExprFuncs,
  uADPhysSQLite, uADStanParam,uADDAptManager, uADCompDataSet, uADGUIxFormsWait,
  uADPhysIntf, uADDatSManager, uADDAptIntf, uADMoniBase,
  uADPhysSQLiteWrapper;
type
  TU32_Query = TADQuery;
  TU32_CustomQuery= TADCustomQuery;
  TU32_Connection = TADConnection;
  TU32_CustomConnection = TADCustomConnection;
  TU32_ESQLiteNativeException = ESQLiteNativeException;
  TU32_TADTable  = TADTable;
  TU32_AutoIncField = TADAutoIncField;
{$ifend}

function create_and_open_sqlite(p_file:string; p_enpcrypt: Boolean= false):TU32_Connection;
var
  a_Database: TU32_Connection;
begin
  a_Database := TU32_Connection.Create(application);

  a_Database.Close;
  a_Database.Params.Clear;
  a_Database.Params.Add(format('Database=%s',[ p_file]));

  //a_Database.Params.Add(format('Database=%s',[ ':memory:']));
  a_Database.Params.Add('StringFormat=Unicode'); // http://www.da-soft.com/anydac/docu/frames.html?frmname=topic&frmfile=Using_SQLite_with_AnyDAC.html
                                                 // http://www.da-soft.com/forums/anydac-general-english/sqlite-string-widestring-av.html
  a_Database.Params.Add('DriverID=SQLite');
  if p_enpcrypt then
  begin
    a_Database.Params.Add('Encrypt=aes-128');
    a_Database.Params.Add('password=aaaa');
  end;

  Result := nil;

  try
    a_Database.Open;
  except
    on e:exception do
    begin
      //a_DatabaseOK:= false;
      //exit;
    end;
  end;

  result :=  a_Database;
end;


procedure zrob_cos_on_db(p_db: TU32_Connection);
var
  q: TU32_Query;
begin
  q:= TU32_Query.Create(p_db);
  q.Connection := p_db;
  q.SQL.Text := 'create table test(id integer);';
  q.ExecSQL;

  if Assigned(q) then q.Free;
end;

procedure TForm19.Button1Click(Sender: TObject);
var
  db: TU32_Connection;
  db_encrypt: TU32_Connection;
begin

  try
    db := create_and_open_sqlite('db.db');
    zrob_cos_on_db(db);
  finally
    db.Free;
  end;

  try
    db_encrypt := create_and_open_sqlite('db_encrypt.db',true);
    zrob_cos_on_db(db_encrypt);
  finally
    db_encrypt.Free;
  end;
end;

end.
0

Ostatecznie zrobiłem baze w access, zaszyfrowałem w tym programie i zmieniłem tylko rozszerzenie w delphi i podałem hasło i działa. Tutaj wklejam filmik po którym się skapnąłem, że też tak można

1 użytkowników online, w tym zalogowanych: 0, gości: 1