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



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




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


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



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

1299   11  

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

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

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

Comments

    Ничего не найдено.