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.

- Rejestracja:ponad 8 lat
- Ostatnio:około 6 godzin
- Postów:34

- Rejestracja:ponad 6 lat
- Ostatnio:10 dni
- Lokalizacja:Silesia/Marki
- Postów:5505

- Rejestracja:ponad 14 lat
- Ostatnio:około 3 godziny
- Postów:2105
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

- Rejestracja:ponad 3 lata
- Ostatnio:ponad rok
- Postów:2310
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ść

- Rejestracja:ponad 8 lat
- Ostatnio:około 6 godzin
- Postów:34
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ę.

- Rejestracja:prawie 13 lat
- Ostatnio:9 miesięcy
- Postów:6610
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.

- Rejestracja:ponad 8 lat
- Ostatnio:około 6 godzin
- Postów:34
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ł...

- Rejestracja:ponad 14 lat
- Ostatnio:około 3 godziny
- Postów:2105
@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

- Rejestracja:ponad 8 lat
- Ostatnio:około 6 godzin
- Postów:34
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.

- Rejestracja:ponad 14 lat
- Ostatnio:około 3 godziny
- Postów:2105
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 ?

- Rejestracja:ponad 8 lat
- Ostatnio:około 6 godzin
- Postów:34
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

- Rejestracja:ponad 14 lat
- Ostatnio:około 3 godziny
- Postów:2105
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.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.