SQLite с шифрованием / защитой паролем
Я только учусь использовать SQLite и мне было любопытно, если такое возможно:
шифрование файла базы данных?
пароль на открытие базы данных?
PS. Я знаю, что есть это "расширение шифрования SQLite (см.).", но согласно документации, " 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 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);
вы можете узнать
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