SQL Server 2016 - 是否可以连接两个 nvarchar 始终加密的列?



>我使用以下命令创建了一个表:

create table dbo.employee(firstname nvarchar(100) null,lastname nvarchar(100) null)

使用以下方法插入了一些示例数据:

insert into dbo.employee values('Sachin','Tendulkar')
insert into dbo.employee values('Rohit','Sharma')
insert into dbo.employee values('Virendra','Sehwag')
insert into dbo.employee values('Irfan','Pathan')

然后,我使用始终加密向导使用 SSMS v17 加密此表的两列。现在我正在尝试将名字与姓氏连接起来,如下所示:

select concat(firstname, lastname) from dbo.employee

它给了我以下错误:

操作数类型冲突:nvarchar(100) 加密为 (encryption_type = "确定性",encryption_algorithm_name = "AEAD_AES_256_CBC_HMAC_SHA_256", column_encryption_key_name = 'SampleDB_CEK', column_encryption_key_database_name = 'SampleDB') 是 与瓦尔查尔不兼容

当我尝试这个时:

select firstname + lastname from dbo.employee

它给出以下错误:

列/变量"名字"的加密方案不匹配, "姓氏"。列/变量的加密方案为 (encryption_type = '确定性',encryption_algorithm_name = "AEAD_AES_256_CBC_HMAC_SHA_256", column_encryption_key_name = 'SampleDB_CEK', column_encryption_key_database_name = 'SampleDB') 而靠近行 '1' 的表达式期望它是 (encryption_type = "明文")(或更弱)。

任何帮助表示赞赏。

加密列上不允许串联。目前,对加密列的唯一可能操作是相等。这是因为SQL Server没有密钥。

您可能必须在客户端应用程序中实现此逻辑。

来自官方文档

确定性加密始终为 生成相同的加密值 任何给定的纯文本值。使用确定性加密允许 点查找、相等联接、加密上的分组和索引 列。但是,也可能允许未经授权的用户猜测 有关加密值的信息,方法是检查 加密列,特别是如果有一小部分可能的 加密值,例如真/假或北/南/东/西区域。 确定性加密必须使用带有二进制的列排序规则2 字符列的排序顺序。

随机加密使用一种方法,该方法在较少的 可预测的方式。随机加密更安全,但可以防止 搜索、分组、索引和联接加密列。

最新更新