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

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

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

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

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

11 ответов

Решение

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

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

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

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

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

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

Ты можешь получить 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

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

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

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

        string filename = @"C:\Programming\sqlite3\db.db";
        string passwordString = "password";
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
        conn.Open();

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

Что ж, SEE дорогой. тем не мение SQLite имеет встроенный интерфейс для шифрования (пейджер). Это означает, что поверх существующего кода можно легко разработать некоторый механизм шифрования, не обязательно AES, Ничего действительно. Пожалуйста, смотрите мой пост здесь: /questions/27511799/realizatsiya-shifrovaniya-sql-aes-v-sqlite-s-ispolzovaniem-php/27511820#27511820

Вам необходимо определить 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

У меня тоже была аналогичная проблема. Необходим для хранения конфиденциальных данных в простой базе данных (SQLite был идеальным выбором, кроме безопасности). Наконец, я разместил файл базы данных на зашифрованном значении TrueCrypt.

Дополнительное консольное приложение подключает временный диск с помощью TrueCrypt CLI, а затем запускает приложение базы данных. Дожидается завершения работы приложения базы данных, а затем снова отключает диск.

Возможно, не подходящее решение для всех сценариев, но для меня работает хорошо...

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

Вы можете использовать подпрограммы создания функций 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');

Включает в себя все, что вы ищете.

БД-браузер для sqlite:

https://sqlitebrowser.org/

Простое создание таблиц, простое изменение данных, легкое удаление и удобные для просмотра компоненты.

документ:

https://github.com/sqlitebrowser/sqlitebrowser/wiki

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

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

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

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

Другие вопросы по тегам