我们在使用 EF6 和始终加密功能时遇到了一些问题。
我相信我们需要在 中设置一些东西DBContext
,以指示如何加密或解密列,但我找不到这样做的方法。
我们已经有一个 ADO 访问层,它与加密字段完美配合。我们宁愿使用 EF 而不是 ADO。
症状是:
- 使用EF,我们可以查询数据。并且解密过程工作正常。
- 插入过程抛出以下错误:
操作数类型冲突:varchar 与使用 (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'Development_v2_qa') collation_name = _SQL_Latin_1_加密的 varchar(8000) 不兼容
- 使用 where 子句查询,使用加密字段,会引发相同的错误。
使用的技术:
- 带有 Poco 实体的 EF6。
- AzureKeyVault 用于存储加密/解密主密钥。
- 使用 SSL 证书对 KeyVault 进行身份验证
- 连接字符串包含“列加密设置=启用;”
- AzureSqlServer
- FWK4.6
- ADO
我们有一些代码可以很好地与 ADO 配合使用。它适用于每个SqlConnection
// Instantiate our custom AKV column master key provider.
// It uses the GetToken function as the callback function to authenticate to AKV
SqlColumnEncryptionAzureKeyVaultProvider akvprov = new SqlColumnEncryptionAzureKeyVaultProvider();
akvprov.KeyVaultClient = SecureConfigurationManager.KeyVaultClient;
// Register the instance of custom provider to SqlConnection
Dictionary<string, SqlColumnEncryptionKeyStoreProvider> providers = new Dictionary<string, SqlColumnEncryptionKeyStoreProvider>();
// "SqlColumnEncryptionAzureKeyVaultProvider.ProviderName" is the name of the provider. It must match the string we used when we created the column master key
providers.Add(SqlColumnEncryptionAzureKeyVaultProvider.ProviderName, akvprov);
SqlConnection.RegisterColumnEncryptionKeyStoreProviders(providers);