Захист паролем БД SQLite. Це можливо?


88

Я маю зіткнутися з новим маленьким проектом. У ньому буде близько 7 або 9 таблиць, найбільша з них зростатиме максимальною швидкістю 1000 рядків на місяць.

Я думав про SQLite як про свою базу даних ... Але мені потрібно буде захистити базу даних на випадок, якщо хтось захоче змінити дані з бази даних

Моє головне питання:

Чи можливо захистити sqlite db паролем, як це можна зробити при доступі?

Які ще СУБД можна порекомендувати для такого невеликого рішення?

Розробка буде на C #, але я шукаю щось безкоштовне.


2
Можливо, ви захочете перевірити SQLiteCrypt
Mike Buckbee


Якщо вам потрібно часто блокувати / розблоковувати БД для налагодження, спробуйте цей інструмент goo.gl/12VnQd
Мангеш

Ви можете знайти рішення тут, введіть опис посилання тут
Ishwar Rimal

Відповіді:


73

Ви можете захистити БД SQLite3 паролем. Перш ніж виконувати будь-які операції, встановіть пароль наступним чином.

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

то наступного разу ви зможете отримати до нього доступ, як

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

Це не дозволить будь-якому редактору графічного інтерфейсу переглядати ваші дані. Деякі редактори можуть розшифрувати БД, якщо ви надасте пароль. Використовуваний алгоритм - RSA.

Пізніше, якщо ви хочете змінити пароль, використовуйте

conn.ChangePassword("new_password");

Щоб скинути або видалити пароль, використовуйте

conn.ChangePassword(String.Empty);

Єдиний безкоштовний інструмент, який я знайшов на сьогоднішній день, щоб відкрити такі бази даних, що захищені паролем, - це SQLite2009 Pro, детально описаний у цій відповіді .
JumpingJezza

Який мовний приклад? Схоже на .NET?
pim

1
Технічно .NET - це фреймворк. C # - це мова, яка відображається тут.
vapcguy

Крім того , ви повинні бути обережні з оновленням рядки підключення до наступного відкриття кожен раз при зміні пароля або ви можете в кінцевому підсумку стикаються з помилками: stackoverflow.com/questions/16030601 / ...
vapcguy

Зауважте, що без введення пароля Open () НЕ вийде з ладу в базі даних SQLite, яка захищена паролем, як і слід було очікувати! Не вдається виконати будь-яку подальшу операцію з даними або метаданими над цим відкритим файлом.
Крісті С.

33

Ви можете скористатися вбудованим шифруванням провайдера sqlite .net (System.Data.SQLite). Детальніше див. На http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx

Щоб зашифрувати існуючу незашифровану базу даних або змінити пароль зашифрованої бази даних , відкрийте базу даних, а потім скористайтеся функцією ChangePassword () 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");

Щоб розшифрувати існуючий зашифрований виклик бази данихChangePassword() за допомогою пароля NULLабо ""пароля:

// 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);

Щоб відкрити існуючу зашифровану базу даних або створити нову зашифровану базу даних, вкажіть пароль у, ConnectionStringяк показано в попередньому прикладі, або викликайте SetPassword()функцію перед тим, як відкривати нову SQLiteConnection. Паролі, вказані в ConnectionStringобов’язковому тексті, мають бути прозорим текстом, але паролі, що надаються SetPassword()функцією, можуть бути двійковими байтовими масивами.

// 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

За замовчуванням ключове слово ATTACH використовуватиме той самий ключ шифрування, що і основна база даних, коли приєднує інший файл бази даних до існуючого з'єднання. Щоб змінити цю поведінку, ви використовуєте модифікатор KEY наступним чином:

Якщо ви приєднуєте зашифровану базу даних, використовуючи пароль чистого тексту:

// 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();

Щоб підключити зашифровану базу даних за допомогою двійкового пароля:

// 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
Ця відповідь лише на посилання насправді є яскравим прикладом того, чому ми не робимо відповіді лише на посилання в SO. Фактичне посилання зникло; його вже не існує. Єдина причина, через яку ми можемо побачити сайт, полягає в тому, що він був автоматично заархівований web.archive.org.
Hanlet Escaño

Це вже не працює, таких функцій не знайдено в останніх версіях.
MindRoasterMir

12

Використовуйте SQLCipher, це розширення відкритого джерела для SQLite, яке забезпечує прозоре 256-бітове AES-шифрування файлів баз даних. http://sqlcipher.net


1
Як щодо швидкості? Якщо я використовую sqlcipher, чи це знизить продуктивність?
TomSawyer

6

Ви можете зашифрувати свою базу даних SQLite за допомогою аддону SEE. Таким чином ви запобігаєте несанкціонованому доступу / змінам.

Цитування документації SQLite:

Розширення шифрування SQLite (SEE) - це вдосконалена версія SQLite, яка шифрує файли баз даних за допомогою 128-розрядних або 256-розрядних AES, щоб запобігти несанкціонованому доступу чи змінам. Весь файл бази даних зашифрований, так що для стороннього спостерігача файл бази даних містить білий шум. Немає нічого, що ідентифікує файл як базу даних SQLite.

Ви можете знайти більше інформації про цей аддон за цим посиланням .


7
це розширення також є платним аддоном sqlite.
Джон Бокер,

3

Одним із варіантів буде VistaDB . Вони дозволяють захищати бази даних (або навіть таблиці) паролем (і за бажанням шифрувати).


1
Є ефективніші та безкоштовніші способи!
Саван,

1
@MSS Але - як я вже сказав, рішення VistaDB має деякі переваги, включаючи роздільне шифрування на рівні таблиці замість повного шифрування з'єднання з БД. Я не знаю жодної іншої власної версії .NET, яка б досягла цього. Це також чисто керований, на відміну від більшості інших варіантів - те, що це не безкоштовно, не означає, що існують більш ефективні або кращі варіанти - це повністю залежить від вимог до використання.
Рід Копсі,

3

для вашого запитання про захист паролем вашого sqlite db я не думаю, що це можна зробити.

Ви можете його зашифрувати, ось деякі відомості про це:

http://sqlcrypt.com/

це $ 149 за платформу.


3

Якщо ви використовуєте FluentNHibernate, ви можете використовувати наступний код конфігурації:

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);
        }
}    

Метод UsingFileWithPassword (ім'я файлу, пароль) шифрує файл бази даних і встановлює пароль.
Він працює, лише якщо створено новий файл бази даних. Старий, який не зашифрований, виходить з ладу, коли його відкривають цим методом.


2

Я знаю, що це старе питання, але чи не буде простим рішенням просто захистити файл на рівні ОС? Просто заважайте користувачам отримувати доступ до файлу, і тоді вони не повинні мати змоги торкнутися його. Це лише здогадки, і я не впевнений, що це ідеальне рішення.


2
Я не впевнений, що це хороше рішення, тому що кожен, хто має флешку, може завантажитися в іншу ОС і прочитати файли.
нуреттин

Я думаю, що це справедливо, але тоді в такому випадку вимкніть USB. Якщо хтось має фізичний доступ до вашої машини, можна зробити багато іншого.
Девід Прайс

Ви хочете захистити конфіденційні дані, щоб лише ті інші речі пішли не так.
тричі

З базою даних SQLite це насправді взагалі НЕ можливо. Вам потрібно, щоб користувачі могли як читати, так і писати на нього, тобто ACL папки, в якій живе база даних SQLite, також повинен надавати їм ці дозволи. Ви можете захистити його від не-користувачів, дозволивши лише реальним користувачам дозвіл на цю папку, але ви все ще маєте "внутрішню загрозу".
vapcguy,

1

Навіщо потрібно шифрувати базу даних? Користувач може легко розібрати вашу програму і зрозуміти ключ. Якщо ви шифруєте його для мережевої передачі, то подумайте про використання PGP замість того, щоб стискати шар шифрування в шар бази даних.


6
Користувача можна попросити ввести пароль під час запуску, тому жоден ключ не буде досягнутим шляхом розбирання програми.
kgadek

1
Використовуйте Redgate Reflector або ILSpy.
Zev Spitz

4
Чому б ви вклали ключ у програму? ви не робите цього, генеруєте ключ із пароля користувачів і використовуєте його, тоді вам не потрібні жодні секрети у вихідному коді.
трампстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.