2

我有一个首先使用实体​​框架/代码的 MVC 应用程序。我正在尝试设置始终加密以加密列(社会安全号码/ SSN)。我在 Azure 中运行一切,包括使用 Azure 保管库来存储密钥。

我有两个模型,SystemUser 和 Person。SystemUser 本质上是一个可以管理 1 个或多个 People 的帐户/登录名。

定义看起来有点像:

public class Person
{
        [StringLength(30)]
        [Column(TypeName = "varchar")]
        public string SSN { get; set; } // Social Security Number
        ...
        [Required, MaxLength(128)]
        public string SystemUserID { get; set; }
        [ForeignKey("SystemUserID")]
        public virtual SystemUser SystemUser { get; set; }
        ...
}

public class SystemUser
{
        ...
        [ForeignKey("SystemUserID")]
        public virtual HashSet<Person> People { get; set; }
        ...
}

我有一个非常基本的页面设置,它只是查找用户并打印出他们的 SSN。这行得通。然后我调整了页面以更新 SSN,这也有效。这对我来说意味着 Always Encrypted 配置和 Azure Vault 设置正确。我在连接字符串中有“列加密设置=启用”,我使用 SSMS 加密了列 SSN(我正在使用确定性)。

在我的 SystemUser 类中,我有以下方法作为 Identity 的实现:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<SystemUser> manager)
{
        ...
        if (this.People.Any())
        {
                ...
        }
        ...
}

这用于用户登录。运行代码会导致:

System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参阅内部异常。---> System.Data.SqlClient.SqlException:操作数类型冲突:varchar 与使用 (encryption_type = 'DETERMINISTIC',encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name = 'CEK_Auto11',column_encryption_key_database_name = 'xxx' 加密的 varchar(30) 不兼容) collat​​ion_name = 'Latin1_General_BIN2'

它似乎在“if (this.People.Any())”上面的行上失败了。在该行之前放置一个断点会显示有关 this.People 的以下内容:

'((System.Data.Entity.DynamicProxies.SystemUser_9F939A0933F4A8A3724213CF7A287258E76B1C6775B69BD1823C0D0DB6A88360)this).People' 引发了类型为 'System.Data.Entity.Core.EntityCommandExecutionException' System.Collections.Generic.HashSet {System.Data.Entity.Core.实体命令执行异常}

这里有什么想法吗?我是否在做 Always Encrypted 不支持的事情?

4

3 回答 3

1

始终加密在实体框架中没有支持。MS还在工作。

于 2017-12-20T10:47:59.250 回答
1

此博客将 Always Encrypted 与 Entity Framework 6一起使用,解释了如何将 Always Encrypted 与 Entity Framework 6 一起用于数据库优先和代码优先从现有数据库和代码优先迁移,以及针对不同场景和问题的解决方法。

于 2018-02-04T10:53:35.087 回答
1

根据https://blogs.msdn.microsoft.com/sqlsecurity/2015/08/27/using-always-encrypted-with-entity-framework-6/

将常量参数作为闭包传递——这将强制参数化,产生>正确的查询:

var ssn = "123-45-6789";

context.Patients.Where(p => p.SSN == ssn);

于 2018-07-18T12:28:06.263 回答