Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
По умолчанию SQLite не поддерживает шифрование файлов базы данных. Вместо этого необходимо использовать измененную версию SQLite, например SQLCipher, SQLiteCrypt или wxSQLite3. Хотя в этой статье показано, как использовать неподдерживаемую сборку SQLCipher с открытым кодом, этот подход в целом применим и к другим решениям.
Установка
dotnet remove package Microsoft.Data.Sqlite
dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.bundle_e_sqlcipher
См. сведения об использовании другой собственной библиотеки для шифрования в руководстве по настраиваемым версиям SQLite.
Выбор ключа
Чтобы включить шифрование в новой базе данных, укажите ключ с помощью ключевого слова строки подключения Password. Используйте SqliteConnectionStringBuilder, чтобы добавить или обновить значение из входных данных пользователя и избежать атак с помощью внедрения строк подключения.
var connectionString = new SqliteConnectionStringBuilder(baseConnectionString)
{
Mode = SqliteOpenMode.ReadWriteCreate,
Password = password
}.ToString();
Внимание
Корпорация Майкрософт рекомендует использовать самый безопасный поток проверки подлинности. Если вы подключаетесь к Azure SQL, Управляемые удостоверения для ресурсов Azure являются рекомендуемым методом аутентификации.
Совет
Метод шифрования и расшифровки существующих баз данных зависит от используемого решения. Например, предположим, что вам нужно использовать функцию sqlcipher_export() в SQLCipher. Проверьте документацию вашего решения для получения подробностей.
Смена ключей базы данных
Если вам нужно изменить ключ зашифрованной базы данных, выдайте инструкцию PRAGMA rekey.
К сожалению, SQLite не поддерживает параметры в инструкциях PRAGMA. Вместо этого используйте функцию quote(), чтобы предотвратить внедрение кода SQL.
var command = connection.CreateCommand();
command.CommandText = "SELECT quote($newPassword);";
command.Parameters.AddWithValue("$newPassword", newPassword);
var quotedNewPassword = (string)command.ExecuteScalar();
command.CommandText = "PRAGMA rekey = " + quotedNewPassword;
command.Parameters.Clear();
command.ExecuteNonQuery();