【问题标题】:SQL Server 2016 - Is it possible to concatenate two nvarchar always encrypted columns?SQL Server 2016 - 是否可以连接两个 nvarchar 始终加密的列?
【发布时间】:2017-05-29 11:29:08
【问题描述】:

我创建了一个表使用:

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 = '确定性',加密算法名称 = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'SampleDB_CEK', column_encryption_key_database_name = 'SampleDB') 是 与 varchar 不兼容

当我尝试这个时:

select firstname + lastname from dbo.employee

它给出以下错误:

列/变量“名字”的加密方案不匹配, '姓'。列/变量的加密方案是 (encryption_type = 'DETERMINISTIC', 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 = 'PLAINTEXT')(或更弱)。

任何帮助表示赞赏。

【问题讨论】:

  • 预计它是 (encryption_type = 'PLAINTEXT')(或更弱)。这些信息还不够吗?

标签: sql-server-2016 always-encrypted


【解决方案1】:

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

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

来自官方文档

确定性加密总是生成相同的加密值 任何给定的纯文本值。使用确定性加密允许 加密的点查找、等式连接、分组和索引 列。但是,也可能让未经授权的用户猜测 通过检查模式中的有关加密值的信息 加密列,特别是如果存在一小组可能的 加密值,例如 True/False,或 North/South/East/West 区域。 确定性加密必须使用带有二进制的列排序规则2 字符列的排序顺序。

随机加密使用一种以更少的时间加密数据的方法 可预见的方式。随机加密更安全,但可以防止 对加密列进行搜索、分组、索引和连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多