SQLite с шифрованием / защитой паролем - PullRequest
118 голосов
/ 15 апреля 2011

Я только учусь использовать SQLite, и мне было любопытно, если это возможно:

  1. Шифрование файла базы данных?

  2. Защита паролем открытия базы данных?

PS.Я знаю, что существует это «Расширение шифрования SQLite (SEE)», но согласно документации «SEE - это лицензионное программное обеспечение…» и «Стоимость бессрочной лицензии на исходный код для SEE составляет 2000 долларов США».

Ответы [ 11 ]

94 голосов
/ 04 мая 2011

SQLite имеет встроенные хуки для шифрования, которые не используются в обычном дистрибутиве, но я знаю несколько реализаций:

  • SEE - Официальная реализация.
  • wxSQLite - Оболочка C ++ в стиле wxWidgets, которая также реализует шифрование SQLite.
  • SQLCipher - Для реализации используется libcrypto из openSSL.
  • SQLiteCrypt - Пользовательская реализация, модифицированный API.
  • botansqlite3 - botansqlite3 - это кодек шифрования для SQLite3, который может использовать любые алгоритмы в Botan для шифрования.
  • SQLiteCrypto - SQLiteCrypto - это самый простой способ шифрования базы данных Sqlite с помощью AES-256 и SHA-256

Для SEE, SQLiteCrypt и SQLiteCrypto требуется приобрести лицензию.

Раскрытие информации: я создал botansqlite3.

18 голосов
/ 22 июня 2014

Вы можете защитить паролем базу данных 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();

Это не позволит любому редактору графического интерфейса пользователя просматривать ваши данные,Позже, если вы хотите изменить пароль, используйте conn.ChangePassword("new_password"); Чтобы сбросить или удалить пароль, используйте conn.ChangePassword(String.Empty);

14 голосов
/ 14 мая 2012

Библиотека .net System.Data.SQLite также обеспечивает шифрование.

7 голосов
/ 05 октября 2014

Вы можете получить sqlite3.dll файл с поддержкой шифрования от http://system.data.sqlite.org/.

1 - Перейдите на http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki и загрузите один из пакетов. Версия .NET здесь неактуальна.

2 - Извлеките SQLite.Interop.dll из пакета и переименуйте его в sqlite3.dll. Эта DLL-библиотека поддерживает шифрование с помощью незашифрованных паролей или ключей шифрования.

Указанный файл является нативным и НЕ требует .NET framework. Может потребоваться среда выполнения Visual C ++ в зависимости от загруженного пакета.

UPDATE

Это пакет, который я скачал для 32-разрядной разработки: http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip

3 голосов
/ 15 октября 2015

Имейте в виду, что следующее не является заменой правильного решения для безопасности.

Проиграв с этим четыре дня, я собрал решение, использующее только систему с открытым исходным кодом.Пакет .Data.SQLite от NuGet.Я не знаю, какую защиту это обеспечивает.Я использую его только для собственного курса обучения.Это создаст БД, зашифрует ее, создаст таблицу и добавит данные.

using System.Data.SQLite;

namespace EncryptDB
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = @"C:\Programming\sqlite3\db.db";
            string passwordString = "password";
            byte[] passwordBytes = GetBytes(passwordString);
            SQLiteConnection.CreateFile(connectionString);
            SQLiteConnection conn = new SQLiteConnection("Data Source=" + connectionString + ";Version=3;");
            conn.SetPassword(passwordBytes);
            conn.Open();
            SQLiteCommand sqlCmd = new SQLiteCommand("CREATE TABLE data(filename TEXT, filepath TEXT, filelength INTEGER, directory TEXT)", conn);
            sqlCmd.ExecuteNonQuery();
            sqlCmd = new SQLiteCommand("INSERT INTO data VALUES('name', 'path', 200, 'dir')", conn);
            sqlCmd.ExecuteNonQuery();
            conn.Close();
        }
        static byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            bytes = System.Text.Encoding.Default.GetBytes(str);
            return bytes;
        }
    }
}

При желании вы можете удалить conn.SetPassword(passwordBytes); и заменить его на conn.ChangePassword("password");, который необходимо поместить после conn.Open(); вместо раньше.Тогда вам не понадобится метод GetBytes.

Чтобы расшифровать, достаточно просто ввести пароль в строку подключения перед открытием вызова.

        string filename = @"C:\Programming\sqlite3\db.db";
        string passwordString = "password";
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
        conn.Open();
3 голосов
/ 15 апреля 2011

Это, безусловно, возможно, и кроме SEE существует несколько решений с открытым исходным кодом. Среди них расширение шифрования, поставляемое с wxSQLite3. Подробности см. В моем ответе на аналогичный вопрос.

2 голосов
/ 15 апреля 2011

Вы всегда можете зашифровать данные на стороне клиента. Обратите внимание, что не все данные должны быть зашифрованы, так как они имеют проблемы с производительностью.

1 голос
/ 08 марта 2018

Ну, SEE дорого. Однако SQLite имеет встроенный интерфейс для шифрования (пейджер). Это означает, что поверх существующего кода можно легко разработать некоторый механизм шифрования, который не обязательно должен быть AES. Ничего действительно. Пожалуйста, смотрите мой пост здесь: https://stackoverflow.com/a/49161716/9418360

Вам необходимо определить SQLITE_HAS_CODEC = 1, чтобы включить шифрование пейджера. Пример кода ниже (оригинал SQLite источник):

#ifdef SQLITE_HAS_CODEC
/*
** This function is called by the wal module when writing page content
** into the log file.
**
** This function returns a pointer to a buffer containing the encrypted
** page content. If a malloc fails, this function may return NULL.
*/
SQLITE_PRIVATE void *sqlite3PagerCodec(PgHdr *pPg){
  void *aData = 0;
  CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData);
  return aData;
}
#endif

В C language имеется коммерческая версия для шифрования SQLite с использованием AES256 - она ​​также может работать с PHP, но ее необходимо скомпилировать с расширением PHP и SQLite. Он де / шифрует файл базы данных SQLite на лету, содержимое файла всегда зашифровано. Очень полезно.

http://www.iqx7.com/products/sqlite-encryption

0 голосов
/ 14 августа 2018

Для проектов, использующих Javascript, пакет, написанный journeyapps , работает без проблем.

https://github.com/journeyapps/node-sqlcipher

Он работал на Mac / Windows / Linux для меня.Он компилирует SQLCipher на вашей платформе.Нет необходимости платить за лицензии от Zetetic.

0 голосов
/ 31 марта 2018

Да, это возможно. Если ориентироваться на .Net Standard 4.6.1+ или Core, я думаю, что довольно просто получить шифрование Sqlite - использовать Microsoft.Data.Sqlite для моего ответа здесь .

...