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