Шифрование SQLite в Microsoft.EntityFrameWork

В настоящее время я пытаюсь зашифровать базу данных SQLite с официальным расширением SEE при использовании инфраструктуры сущностей Microsoft.

Я могу зашифровать базу данных при использовании ADO.NET. Однако возникает ошибка «Вы указали пароль в строке подключения, но собственная библиотека SQLite «e_sqlite3» не поддерживает шифрование» при использовании фреймворка сущностей.

Используемые пакеты NuGet:

[Microsoft.EntityFrameWork.Core Microsoft.EntityFrameWork.Core.SQLite SQLite.Encryption.Extension System.Data.SQLite.Core]

Подскажите, пожалуйста, как исправить эту ошибку с официальным расширением SEE?

CustomDBContext.cs:

private readonly bool _created = false;

public CustomDbContext(DBContextOptions<CustomDbContext> options):base(options){

if(!_created)
{
_created = true;
Database.EnsureCreated();
}
}

public DbSet<SampleEntity> SampleEntities {get; set;}

Программа.cs:

static void Main(string[] args)
{
var services = new ServiceCollection();
ConfigureService(services);
using ServiceProvider provider = services.BuildServiceProvider();
provider.GetService<ICustomDBContext>();
}

private static void ConfigureServices(ServiceCollection services)
{
string password = Convert.ToHexString(Encoding.Default.GetBytes("aes256:test");

SQLiteCommand.Execute("PRAGMA activate_extensions='see-7bb07b8d471d642e'", SQLiteExecuteType.NonQuery,@"Data Source=c:\users\test.db");

SQLiteConnectionStringBuilder connectionStringBuilder = new(){
ConnectionString = @"Data Source=c:\users\test.db;Password="+password};

SQLiteConnection conn = new(connectionStringBuilder.ConnectionString);

connection.Open();
connection.ChangePassword(password);
services.AddDbContext<CustomDBContext>(options => options.UseSqlite(connection));
}

person parthasarathy tamilselvam    schedule 21.07.2021    source источник
comment
Пожалуйста, покажите код, который вы сделали до сих пор   -  person Serge    schedule 21.07.2021
comment
Шифрование — это то, что вы устанавливаете в строке подключения. Это не имеет ничего общего с EF Core. Вам нужно использовать библиотеку, которая поддерживает шифрование.   -  person Panagiotis Kanavos    schedule 21.07.2021
comment
@Serge добавил код. DataBase.EnsureCreated() — это строка кода, в которой возникает ошибка.   -  person parthasarathy tamilselvam    schedule 21.07.2021
comment
@parthasarathytamilselvam SQLite сам по себе не поддерживает шифрование. Для этого вам понадобится расширение. Это не имеет ничего общего с EF Core. документы Microsoft показывают, как использовать пользовательскую версию SQLite, которая поддерживает шифрование, используя SQLCipher вместо стандартного поставщика SQLite   -  person Panagiotis Kanavos    schedule 21.07.2021
comment
Я приобрел SEE (официальное расширение) у SQLite, и при использовании ADO.NET с шифрованием SQLite проблем не возникает. Однако, когда я передаю соединение и пытаюсь вызвать DataBase.EnsureCreated, возникает исключение. Я также просмотрел документы Microsoft и образец, доступный только для sql_cipher, и тот же подход не работает для официального расширения.   -  person parthasarathy tamilselvam    schedule 21.07.2021
comment
@PanagiotisKanavos SEE выбран нашей командой безопасности, и я связался со службой поддержки SQLite, и они говорят, что это похоже на ошибку из-за EF. Я перепробовал множество ресурсов с переполнением стека, но не смог найти соответствующую тему с официальным расширением для SQLite.   -  person parthasarathy tamilselvam    schedule 21.07.2021
comment
Опять же, EF Core не имеет ничего общего с поставщиком SQLite. Это ADO.NET, который общается с SQLite через вашего провайдера ADO.NET. Это не обсуждается. Это означает, что большая часть вашего вопроса не имеет отношения к делу. Только части ADO.NET имеют значение, а важные части, такие как то, как вы на самом деле добавили и зарегистрировали SEE, отсутствуют. Похоже, вы не вообще используете SEE в своем коде и подключаетесь с помощью провайдера по умолчанию. Вот что говорит ошибка. Где вы добавили провайдера SEE?   -  person Panagiotis Kanavos    schedule 21.07.2021
comment
Чтобы устранить эту проблему, создайте новый пустой консольный проект, используйте только ADO.NET и добавьте только строки, необходимые для регистрации SEE, создайте и откройте новое соединение. System.Data.Sqlite не является библиотекой Microsoft, несмотря на ее название.   -  person Panagiotis Kanavos    schedule 21.07.2021
comment
@PanagiotisKanavos уверен. Это работает для ADO.Net.   -  person parthasarathy tamilselvam    schedule 21.07.2021
comment
Тогда это работает и для EF Core. Каким-то образом вы в конечном итоге используете не того провайдера в другом проекте. Код вопроса в основном представляет собой код DI, который не имеет ничего общего с EF Core, но откуда берется UseSqlite? Пакет Microsoft.EntityFrameWork.Core.SQLite использует SQLitePCLRaw.bundle_e_sqlite3. Таким образом, вы в конечном итоге настраиваете EF Core для использования стандартного поставщика вместо SEE.   -  person Panagiotis Kanavos    schedule 21.07.2021
comment
В яблочко. Метод UseSqlite взят из пакета Microsoft.EntityFrameWorkCore.SQLite и использует общедоступную версию библиотек SQLite.   -  person parthasarathy tamilselvam    schedule 21.07.2021
comment
Библиотеки шифрования SQLite, добавленные как отдельный пакет из Nuget, нельзя использовать, поскольку Microsoft.EntityFrameWorkCore.SQLite относится только к общедоступной версии SQLite.   -  person parthasarathy tamilselvam    schedule 21.07.2021
comment
Да, это то, что я сказал. Вы установили и использовали стандартную библиотеку SQLite, когда хотели использовать пользовательскую. Как ответ на этот вопрос SO объясняет хотя пакет Microsoft.EntityFrameWork.Core.SQLite — это просто пакет Microsoft.EntityFrameWork.Core.SQLite.Core и файлы, поставляемые пакетом SQLite. Возможно, вы сможете использовать только Microsoft.EntityFrameWork.Core.SQLite.Core, если убедитесь, что ваши собственные файлы скопированы в правильную папку.   -  person Panagiotis Kanavos    schedule 21.07.2021
comment
Попробуйте установить Microsoft.EntityFrameWork.Core.SQLite.Core вместо Microsoft.EntityFrameWork.Core.SQLite. Если SQLite.Encryption.Extension и System.Data.SQLite.Core развертывают библиотеки DLL с теми же именами и в тех же местах, что и e_sqlite3, вы можете использовать SQLite без дополнительного кода. В противном случае проверьте Использовать динамический провайдер в документах Microsoft. Вы можете использовать Microsoft.Data.Sqlite при загрузке SEE   -  person Panagiotis Kanavos    schedule 21.07.2021
comment
Попытался использовать Microsoft.EntityFrameWorkCore.SQLite.Core и получил ошибку «Вам нужно вызвать SQLitePCL.raw.SetProvider()…» и попытался добавить пакеты самородков для пакета и столкнулся с той же проблемой пароля.   -  person parthasarathy tamilselvam    schedule 21.07.2021
comment
@PanagiotisKanavos уверен   -  person parthasarathy tamilselvam    schedule 21.07.2021
comment
@PanagiotisKanavos 1. Интересно, что при использовании SQLite.Encryption.Extension и System.Data.SQLite.Core не создается e_sqlite3. 2. Microsoft.Data.Sqlite и SEE не работают вместе, поскольку Microsoft.Data.SQLite будет создавать только общедоступную версию SQLite, которую мы не можем использовать для шифрования.   -  person parthasarathy tamilselvam    schedule 21.07.2021
comment
После анализа и обсуждения с командой SQLite мы поняли, что SQLite поддерживает только до EF6, а для ядра EF пока нет поддержки.   -  person parthasarathy tamilselvam    schedule 27.07.2021


Ответы (1)


Чтобы использовать официальное расширение SQLite для шифрования, выберите платформу сущностей до EF6, поскольку библиотека System.Data.SQLite поддерживает только до EF6, а прямая поддержка ядра EF отсутствует.

Если нам все еще нужно использовать ядро ​​Entity Framework, то мы также можем рассмотреть другие варианты, такие как шифрование с использованием SQLCipher, которое поддерживает ядро ​​EF.

person parthasarathy tamilselvam    schedule 27.07.2021