У меня есть проект с EFCore 3.1. В одной из сущностей мы храним секретное значение как строковое свойство, которое отображается в поле с тем же именем в БД.
public string SecretValue {get; set;}
Мне бы хотелось автоматическое шифрование секретного значения при сохранении объекта в БД и автоматическое его дешифрование при загрузке из БД. Таким образом, я могу чувствовать себя счастливее от того, что мы храним в БД, и разработчикам не придется беспокоиться о проблемах шифрования, так как это будет обрабатываться на очень низком уровне.
У меня был Мы думали сделать это так, как в старом EF, мы могли бы переопределить методы DBContext SaveChanges и ObjectMaterialization, но, очевидно, EFCore 3.1 не может быть переопределен таким же образом. Имеется какая-то вещь с очень низким уровнем перехватчика БД, но она кажется слишком низкой для моих целей; Я не хочу go пробираться через SQL.
У меня есть еще одна идея, которая заключается в добавлении другого свойства к сущности, например
public string PlaintextSecretValue
{
get { return MyEncryptionTool.Decrypt(SecretValue); }
set { SecretValue = MyEncryptionTool.Encrypt(value); }
}
А затем каким-то образом запретить разработчикам прямой доступ к свойству SecretValue
, одновременно позволяя EF автоматически загружать и сохранять его в БД. Но для того, чтобы это было разработано правильно, я думаю, что MyEncryptionTool
нужно было бы каким-то образом внедрить, сконструировать его с секретным ключом из config, и я не знаю, как это сделать.
Любые идеи, пожалуйста