SQLite с шифрованием / защитой паролем

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

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

  2. пароль на открытие базы данных?

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

11 ответов


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

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

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

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


вы можете защитить паролем sqlite3 DB. В первый раз перед выполнением каких-либо операций установите пароль следующим образом.

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

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


библиотека .net


вы можете узнать 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++.

обновление

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


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


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

поиграв с этим в течение четырех дней, я собрал решение, используя только систему с открытым исходным кодом.Данные.Пакет 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();

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


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

вам нужно определить SQLITE_HAS_CODEC=1, чтобы включить шифрование пейджера. Пример кода ниже (original 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 (руководство по PHP):

$db_obj->sqliteCreateFunction('Encrypt', 'MyEncryptFunction', 2);
$db_obj->sqliteCreateFunction('Decrypt', 'MyDecryptFunction', 2);

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

$insert_obj = $db_obj->prepare('INSERT INTO table (Clear, Encrypted) ' .
 'VALUES (:clear, Encrypt(:data, "' . $passwordhash_str . '"))');

при получении данных, вы также можете использовать функцию поиска в SQL:

$select_obj = $db_obj->prepare('SELECT Clear, ' .
 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
 'WHERE PlainText LIKE :searchterm');

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


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

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

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