Ochrona hasłem bazy danych SQLite. Czy to możliwe?


88

Muszę zmierzyć się z nowym małym projektem. Będzie miał około 7 lub 9 tabel, z których największy będzie powiększał się maksymalnie o 1000 wierszy miesięcznie.

Myślałem o SQLite jako mojej bazie danych ... Ale będę musiał chronić bazę danych na wypadek, gdyby ktoś chciał zmienić dane z bazy danych

Moje główne pytanie brzmi:

Czy możliwe jest zabezpieczenie bazy danych sqlite hasłem, tak jak w przypadku dostępu?

Jakie inne RDBMS poleciłbyś do tak małego rozwiązania?

Rozwój byłby na C #, ale szukam czegoś wolnego.


2
Możesz sprawdzić SQLiteCrypt
Mike Buckbee


Jeśli chcesz zablokować / odblokować DB często do debugowania, spróbuj tego narzędzia goo.gl/12VnQd
Mangesh

Możesz znaleźć rozwiązanie tutaj, wprowadź opis linku tutaj
Ishwar Rimal

Odpowiedzi:


73

Możesz zabezpieczyć hasłem bazę danych SQLite3. Przed wykonaniem jakichkolwiek operacji ustaw hasło w następujący sposób.

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

wtedy następnym razem będziesz mógł uzyskać do niego dostęp

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

To nie pozwoli żadnemu edytorowi GUI na przeglądanie twoich danych. Niektórzy redaktorzy mogą odszyfrować bazę danych, jeśli podasz hasło. Zastosowany algorytm to RSA.

Później, jeśli chcesz zmienić hasło, użyj

conn.ChangePassword("new_password");

Aby zresetować lub usunąć hasło, użyj

conn.ChangePassword(String.Empty);

Jedynym darmowym narzędziem, które do tej pory znalazłem, które otwiera bazy danych chronione hasłem, takie jak ta, jest SQLite2009 Pro, wyszczególnione w tej odpowiedzi .
JumpingJezza,

Jakim językiem jest ten przykład? Wygląda na .NET?
pim

1
Technicznie rzecz biorąc, .NET to framework. C # to język wyświetlany w tym miejscu.
vapcguy

Musisz także uważać na aktualizację parametrów połączenia przed następnym otwarciem za każdym razem, gdy zmieniasz hasło, w przeciwnym razie możesz
napotkać

Zwróć uwagę, że bez podania hasła Open () NIE zawiedzie w chronionej hasłem bazie danych SQLite, jak można się spodziewać! Niepowodzenie to każda kolejna operacja na danych lub metadanych na tym otwartym pliku.
Cristi S.

33

Możesz użyć wbudowanego szyfrowania dostawcy sqlite .net (System.Data.SQLite). Zobacz więcej szczegółów na http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx

Aby zaszyfrować istniejącą niezaszyfrowaną bazę danych lub zmienić hasło do zaszyfrowanej bazy danych , otwórz bazę danych, a następnie użyj funkcji ChangePassword () w SQLiteConnection:

// Opens an unencrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
// Encrypts the database. The connection remains valid and usable afterwards.
cnn.ChangePassword("mypassword");

Aby odszyfrować zaszyfrowane istniejącej bazy danych połączenia ChangePassword()z NULLlub ""hasło:

// Opens an encrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword");
cnn.Open();
// Removes the encryption on an encrypted database.
cnn.ChangePassword(null);

Aby otworzyć istniejącą zaszyfrowaną bazę danych lub utworzyć nową zaszyfrowaną bazę danych, określ hasło w ConnectionStringsposób pokazany w poprzednim przykładzie lub wywołaj SetPassword()funkcję przed otwarciem nowej SQLiteConnection. Hasła określone w ConnectionStringmuszą być zwykłym tekstem, ale hasła podane w SetPassword()funkcji mogą być binarnymi tablicami bajtowymi.

// Opens an encrypted database by calling SetPassword()
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 });
cnn.Open();
// The connection is now usable

Domyślnie słowo kluczowe ATTACH będzie używać tego samego klucza szyfrowania co główna baza danych podczas dołączania innego pliku bazy danych do istniejącego połączenia. Aby zmienić to zachowanie, użyj modyfikatora KEY w następujący sposób:

Jeśli dołączasz zaszyfrowaną bazę danych przy użyciu hasła w postaci zwykłego tekstu:

// Attach to a database using a different key than the main database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY 'mypassword'", cnn);
cmd.ExecuteNonQuery();

Aby dołączyć zaszyfrowaną bazę danych przy użyciu hasła binarnego:

// Attach to a database encrypted with a binary key
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn);
cmd.ExecuteNonQuery();

2
Ta odpowiedź zawierająca tylko łącze jest w rzeczywistości wyraźnym przykładem, dlaczego w SO nie udzielamy odpowiedzi zawierających tylko łącze. Faktyczny link zniknął; już nie istnieje. Jedynym powodem, dla którego możemy zobaczyć tę witrynę, jest to, że została automatycznie zarchiwizowana przez web.archive.org.
Hanlet Escaño,

To już nie działa, nie ma takich funkcji w najnowszych wersjach.
MindRoasterMir

12

Użyj SQLCipher, to rozszerzenie open source dla SQLite, które zapewnia przezroczyste 256-bitowe szyfrowanie AES plików bazy danych. http://sqlcipher.net


1
A co z prędkością? Jeśli użyję sqlcipher, czy zmniejszy to wydajność?
TomSawyer,

6

Możesz zaszyfrować swoją bazę danych SQLite za pomocą dodatku SEE. W ten sposób zapobiegasz nieautoryzowanemu dostępowi / modyfikacji.

Cytując dokumentację SQLite:

Rozszerzenie SQLite Encryption (SEE) to ulepszona wersja oprogramowania SQLite, która szyfruje pliki bazy danych przy użyciu 128-bitowego lub 256-bitowego algorytmu AES, aby zapobiec nieautoryzowanemu dostępowi lub modyfikacji. Cały plik bazy danych jest zaszyfrowany, tak że dla obserwatora zewnętrznego plik bazy danych wydaje się zawierać biały szum. Nie ma nic, co identyfikowałoby plik jako bazę danych SQLite.

Więcej informacji o tym dodatku znajdziesz w tym linku .


7
to rozszerzenie jest również płatnym dodatkiem do sqlite.
John Boker,

3

Jedną z opcji byłoby VistaDB . Umożliwiają one ochronę baz danych (a nawet tabel) (i opcjonalnie szyfrowanie).


1
Są bardziej wydajne i darmowe sposoby!
Sawan

1
@MSS Ale - jak powiedziałem, rozwiązanie VistaDB ma pewne zalety, w tym oddzielne szyfrowanie na poziomie tabeli zamiast pełnego szyfrowania połączenia DB. Nie znam żadnej innej natywnej opcji .NET, która to umożliwia. Jest również czysto zarządzany, w przeciwieństwie do większości innych opcji - tylko dlatego, że nie jest darmowy, nie oznacza, że ​​istnieją wydajniejsze lub lepsze opcje - zależy to całkowicie od wymagań użytkowania.
Reed Copsey

3

jeśli chodzi o twoje pytanie o hasło chroniące twoją bazę danych sqlite, nie sądzę, że da się to zrobić.

możesz to jednak zaszyfrować, oto kilka informacji na ten temat:

http://sqlcrypt.com/

to 149 USD za platformę.


3

Jeśli używasz FluentNHibernate , możesz użyć następującego kodu konfiguracyjnego:

private ISessionFactory createSessionFactory()
{
    return Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.UsingFileWithPassword(filename, password))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<DBManager>())
            .ExposeConfiguration(this.buildSchema)
            .BuildSessionFactory();    
}

private void buildSchema(Configuration config)
{
        if (filename_not_exists == true)
        {
            new SchemaExport(config).Create(false, true);
        }
}    

Metoda UsingFileWithPassword (nazwa pliku, hasło) szyfruje plik bazy danych i ustawia hasło.
Działa tylko wtedy, gdy zostanie utworzony nowy plik bazy danych. Stary, niezaszyfrowany, kończy się niepowodzeniem, gdy jest otwierany tą metodą.


2

Wiem, że to stare pytanie, ale czy nie byłoby prostym rozwiązaniem po prostu ochrona pliku na poziomie systemu operacyjnego? Po prostu zablokuj użytkownikom dostęp do pliku, a wtedy nie powinni mieć możliwości jego dotknięcia. To tylko przypuszczenie i nie jestem pewien, czy jest to idealne rozwiązanie.


2
Nie jestem pewien, czy to dobre rozwiązanie, ponieważ każdy, kto ma pamięć USB, może uruchomić inny system operacyjny i odczytać pliki.
nurettin

Myślę, że to słuszna uwaga, ale w takim przypadku wyłącz USB. Jeśli ktoś ma fizyczny dostęp do twojego komputera, możesz zrobić wiele innych rzeczy.
David Price

Chcesz chronić poufne dane, aby tylko te inne rzeczy się nie udały.
tripleee

W przypadku bazy danych SQLite NIE jest to w ogóle możliwe. Potrzebujesz, aby użytkownicy mogli zarówno czytać, jak i zapisywać do niego, co oznacza, że ​​lista ACL folderu, w którym znajduje się baza danych SQLite, musi im również zezwalać na te uprawnienia. Możesz zabezpieczyć go przed nieużytkownikami, zezwalając tylko prawdziwym użytkownikom na dostęp do tego folderu, ale nadal masz „zagrożenie wewnętrzne”.
vapcguy

1

Dlaczego musisz zaszyfrować bazę danych? Użytkownik może łatwo zdemontować program i odgadnąć klucz. Jeśli szyfrujesz go do transferu sieciowego, rozważ użycie PGP zamiast wciskania warstwy szyfrowania do warstwy bazy danych.


6
Użytkownik może zostać poproszony o podanie hasła podczas uruchamiania, więc żaden klucz nie byłby osiągalny przez odinstalowanie programu.
kgadek

1
Użyj reflektora Redgate lub ILSpy.
Zev Spitz

4
Dlaczego miałbyś umieścić klucz w programie? nie zrobiłbyś tego, wygeneruj klucz z hasła użytkownika i użyj go, wtedy nie potrzebujesz żadnych sekretów w swoim kodzie źródłowym.
trampster
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.