Поделиться через


Шифрование

По умолчанию 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();