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.
Odpowiedzi:
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);
źródło
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()
zNULL
lub""
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
ConnectionString
sposób pokazany w poprzednim przykładzie lub wywołajSetPassword()
funkcję przed otwarciem nowejSQLiteConnection
. Hasła określone wConnectionString
muszą być zwykłym tekstem, ale hasła podane wSetPassword()
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();
źródło
Użyj SQLCipher, to rozszerzenie open source dla SQLite, które zapewnia przezroczyste 256-bitowe szyfrowanie AES plików bazy danych. http://sqlcipher.net
źródło
Możesz zaszyfrować swoją bazę danych SQLite za pomocą dodatku SEE. W ten sposób zapobiegasz nieautoryzowanemu dostępowi / modyfikacji.
Cytując dokumentację SQLite:
Więcej informacji o tym dodatku znajdziesz w tym linku .
źródło
Jedną z opcji byłoby VistaDB . Umożliwiają one ochronę baz danych (a nawet tabel) (i opcjonalnie szyfrowanie).
źródło
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ę.
źródło
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ą.
źródło
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.
źródło
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.
źródło