Шифрование
По умолчанию SQLite не поддерживает шифрование файлов базы данных. Вместо этого используйте измененную версию SQLite, например SEE, 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();
Внимание
Корпорация Майкрософт рекомендует использовать самый безопасный поток проверки подлинности. Если вы подключаетесь к SQL Azure, управляемые удостоверения для ресурсов 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();