【发布时间】:2018-11-01 13:55:29
【问题描述】:
我有一个场景,我需要在 proc 中使用文字(硬编码字符串)来对抗“始终加密”列,因为这会失败并出现以下错误,
操作数类型冲突:varchar 与 nvarchar(20) 不兼容 用 (encryption_type = 'DETERMINISTIC', 加密算法名称 = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto4', column_encryption_key_database_name = 'DBName')
我正在尝试在存储过程中为 Always Encrypted 进行参数化,类似于下面
GO
CREATE PROCEDURE InsertProc
@Var1 nVarchar(20)
As
BEGIN
DECLARE @Plaintext nvarchar(20)='testText'
INSERT INTO testClass(EncryptedCol1,EncryptedCol2,NonEncryptedCol)
VALUES (@Plaintext,@Var1,default)
END
我还启用了参数化并启用了连接的列加密设置。创建过程还是报如下错误,
过程 sp_describe_parameter_encryption,第 1 行 [批处理开始行 4] 无法准备报表。时发生错误 执行批处理。错误信息是:内部错误。元数据 语句中的参数“@p3467a2cdc3d547a3be48f46dfc7e9580”或 procedure ' 在返回的结果集中丢失 sp_describe_parameter_encryption。
注意:如果我手动运行 proc 中的脚本,我仍然可以执行和插入。但是 Proc 创建是问题
有人可以帮助解决或提供替代解决方案吗?
【问题讨论】:
-
你不能这样做。它的构建方式是围绕加密列从未出现在服务器上的明文(直到 2019 年使用安全飞地,但这只是移动了一些东西,它仍然不会作为明文出现在飞地)
-
手动执行它的原因是因为 SSMS 不遗余力地将命令转换为正确使用加密的命令。不幸的是,这只能在客户端工作。不可能让服务器在加密列中插入明文值,因为如果是这样,那将意味着服务器知道加密密钥,这与 Always Encrypted 的整个想法背道而驰。
-
那么是否没有方案可以针对硬编码文字处理加密列?从应用程序发送所有文字作为参数是唯一的选择吗?我急需解决!
-
我知道您目前专注于您的特定用例,但请考虑一个允许某人在帐户之间转移资金的存储过程,其中帐号被加密。 Always Encrypted 旨在保护我们的数据免受数据库管理员等的侵害。您是否真的希望其中一个能够临时更改此存储过程的定义,以便它使用硬编码的文字来表示收件人的他们的帐号?
-
嗯,我明白了,我应该开始一段艰难的旅程,重新设计我的场景。
标签: sql-server sql-server-2017 always-encrypted