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