Entity Framework - всегда в зашифрованном виде - AzureKeyVault - PullRequest
0 голосов
/ 19 декабря 2018

Я использовал AzureKeyVault для шифрования некоторых столбцов Social Security # в SQL.Эти определения столбцов: varchar (11) NULL.

Мои модели в моем коде имеют следующие атрибуты:

    [StringLength(11)]
    [Column(TypeName = "varchar")]
    [RegularExpression(RegExValidators.SSNRegex, ErrorMessage = "SSN must be a number")]
    public string SSN { get; set; }

Однако иногда я вижу эту ошибку в журналах моей базы данных:

System.Data.SqlClient.SqlException: Operand type clash: varchar is incompatible with varchar(11) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto2', column_encryption_key_database_name = 'DB NAME') collation_name = 'Latin1_General_BIN2'
       at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

Странно то, что это не всегда происходит ... просто время от времени.Я запускаю этот код в моей функции Global.asax Application_Start ():

public static class AzureKeyVaultInit
    {
        private static string _clientId = ConfigurationManager.AppSettings["AzureKeyVaultAppClientId"];
        private static string _clientSecret = ConfigurationManager.AppSettings["AzureKeyVaultAppSecret"];
        private static ClientCredential _clientCredential;
        private static bool _isInitialized = false;
        private static readonly object _isInitializedLock = new object();

        public static void InitializeAzureKeyVaultProvider()
        {

            if (string.IsNullOrEmpty(_clientId)) return;

            lock (_isInitializedLock)
            {
                if (!_isInitialized)
                {
                    _clientCredential = new ClientCredential(_clientId, _clientSecret);

                    SqlColumnEncryptionAzureKeyVaultProvider azureKeyVaultProvider = new SqlColumnEncryptionAzureKeyVaultProvider(GetToken);

                    Dictionary<string, SqlColumnEncryptionKeyStoreProvider> providers = new Dictionary<string, SqlColumnEncryptionKeyStoreProvider>();
                    providers.Add(SqlColumnEncryptionAzureKeyVaultProvider.ProviderName, azureKeyVaultProvider);

                    SqlConnection.RegisterColumnEncryptionKeyStoreProviders(providers);

                    _isInitialized = true;

                    Core.Log.Info($"Initialized Azure Key Vault");
                }
            }
        }

Есть что-нибудь очевидное, почему я получаю эту ошибку время от времени?

1 Ответ

0 голосов
/ 19 декабря 2018

Любое значение, которое предназначено для зашифрованного столбца, должно быть зашифровано внутри приложения.Попытка вставить / изменить или фильтровать по текстовому значению в зашифрованном столбце приведет к такой ошибке, как вы.

Чтобы предотвратить такие ошибки, убедитесь, что:

1.Allways Encrypted включен для запросов приложений, нацеленных на зашифрованные столбцы (задайте Column Encryption Setting=enabled в строке подключения или в объекте SqlCommand для конкретного запроса).

2.Используйте SqlParameter для отправки данных с таргетингом на зашифрованные столбцы.

Подробнее см. в этой статье .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...