Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.
Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.
SQLite имеет встроенные в шифрование шифры, которые не используются в обычном дистрибутиве, но вот несколько реализаций, которые я знаю:
SEE, SQLiteCrypt и SQLiteCrypto требуют покупки лицензии.
Раскрытие: я создал botansqlite3.
Вы можете использовать процедуры создания функций 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');
Это, безусловно, возможно, и существует несколько решений с открытым исходным кодом, кроме SEE. Среди них расширение шифрования поступает с помощью wxSQLite3. См. мой ответ на аналогичный вопрос для деталей.
Для проектов, использующих Javascript, пакет, написанный tripapps , работает плавно.
https://github.com/journeyapps/node-sqlcipher
Он работал на Mac / Windows / Linux для меня. Он компилирует SQLCipher на вашей платформе. Нет необходимости платить за лицензии от Zetetic.
Вы можете защитить паролем 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");
Чтобы сбросить или удалить пароль, используйте conn.ChangePassword(String.Empty);
Имейте в виду, что следующее не предназначено для замены надлежащего решения безопасности.
После игры с этим в течение четырех дней я собрал решение, используя только открытый источник Пакет 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();
Вы можете получить файл 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 поддерживает шифрование через пароли открытого текста или ключи шифрования.
Указанный файл является родным, а NOT требует .NET framework. Это может потребоваться Visual C ++ Runtime в зависимости от загруженного вами пакета.
UPDATE
Это пакет, который я загрузил для 32-разрядной разработки: http://system.data.sqlite.org/blobs/1.0.94.0 /sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip
Вы всегда можете шифровать данные на стороне клиента. Обратите внимание, что не все данные должны быть зашифрованы, поскольку они имеют проблемы с производительностью.
Да, это возможно. Если таргетинг на .Net Standard 4.6.1+ или Core, я думаю, достаточно просто получить шифрование Sqlite, чтобы использовать Microsoft.Data.Sqlite для моего ответа здесь .
Хорошо, SEE
стоит дорого. Однако SQLite
имеет встроенный интерфейс для шифрования (Pager). Это означает, что поверх существующего кода можно легко разработать некоторый механизм шифрования, не обязательно AES
. Ничего действительно. См. Мой пост здесь: https://stackoverflow.com/a/49161716/9418360
Для включения шифрования Pager вам необходимо определить 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
. Он de / шифрует файл базы данных SQLite
«на лету», содержимое файла всегда зашифровывается. Очень полезно.
Библиотека .net System.Data.SQLite также обеспечивает шифрование.