Защита паролем базы данных SQLite. Является ли это возможным?


88

Мне предстоит столкнуться с новым маленьким проектом. В нем будет около 7 или 9 таблиц, самая большая из них будет расти не более чем на 1000 строк в месяц.

Я думал о SQLite как о своей базе данных ... Но мне нужно будет защитить базу данных на случай, если кто-то захочет изменить данные из базы данных

Мой главный вопрос:

Можно ли защитить паролем базу данных sqlite, как при доступе?

Какую еще СУБД вы бы порекомендовали для такого небольшого решения?

Разработка будет на C #, но я ищу что-нибудь бесплатное.




Если вам нужно для блокировки / разблокировки DB часто для отладки, попробуйте этот инструмент goo.gl/12VnQd
Mangesh

Вы можете найти решение здесь, введите описание ссылки здесь
Ишвар Римал

Ответы:


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, защищенной паролем, как и следовало ожидать! Не удается выполнить любую последующую операцию с данными или метаданными в этом открытом файле.
Cristi S.

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.
Ханлет Эсканьо,

Больше не работает, в последних версиях таких функций нет.
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
Есть более эффективные и бесплатные способы!
Sawan

1
@MSS Но - как я уже сказал, решение VistaDB имеет некоторые преимущества, включая отдельное шифрование на уровне таблицы вместо полного шифрования соединения с БД. Я не знаю другого варианта .NET, позволяющего это сделать. Он также полностью управляем, в отличие от большинства других вариантов - то, что он не бесплатный, не означает, что существуют более эффективные или лучшие варианты - это полностью зависит от требований использования.
Reed Copsey

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-накопитель, может загрузиться в другую ОС и прочитать файлы.
nurettin

Я думаю, что это справедливо, но в этом случае отключите USB. Если у кого-то есть физический доступ к вашей машине, можно сделать еще много вещей.
Дэвид Прайс

Вы хотите защитить конфиденциальные данные, чтобы только эти другие вещи пошли не так.
Tripleee

С базой данных SQLite это вообще невозможно. Вам нужно, чтобы пользователи могли как читать, так и писать в нее, то есть ACL папки, в которой находится база данных SQLite, также должен предоставлять им эти разрешения. Вы можете защитить его от непользователей, разрешив доступ к этой папке только реальным пользователям, но при этом у вас все еще есть «внутренняя угроза».
vapcguy

1

Зачем нужно шифровать базу данных? Пользователь может легко разобрать вашу программу и выяснить ключ. Если вы шифруете его для передачи по сети, рассмотрите возможность использования PGP вместо сжатия уровня шифрования на уровне базы данных.


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

1
Используйте Redgate Reflector или ILSpy.
Зев Шпиц

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