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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

Вы можете защитить паролем 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"); Чтобы reset или удалить пароль, используйте conn.ChangePassword(String.Empty);

Ответ 3

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

Ответ 4

Вы можете получить 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 С++ Runtime в зависимости от загруженного вами пакета.

UPDATE

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

Ответ 6

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

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

Для дешифрования это просто вопрос ввода пароля в строку подключения перед открытием вызова.

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

Ответ 7

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

Ответ 8

litereplica поддерживает encryption используя шифр ChaCha.

Чача почти в 3 раза быстрее, чем AES на портативных устройствах на базе ARMv7.

Чтобы создать и открыть зашифрованную базу данных, мы используем URI следующим образом:

"file:/path/to/file.db?cipher=...&key=..."

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

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

Ответ 13

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

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

https://sqlitebrowser.org/

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

документ:

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