【发布时间】:2019-07-23 21:07:13
【问题描述】:
我需要使用密码短语加密方法来加密几列。不幸的是,这些加密列需要用于相互连接。并且有很多视图存储过程等我不想修改。
如果您想尝试一下,这里是下面的小提琴 https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=cc71b4969526eb0fedd22de2828abaa3
设置
create table encrypt.empsone(empno varchar(10),empno_encrypted varbinary(100));
create table encrypt.empstwo(empno varchar(10),empno_encrypted varbinary(100));
insert into encrypt.empsone(empno, empno_encrypted )
values('001', EncryptByPassPhrase('my passphrase','001'))
insert into encrypt.empstwo(empno, empno_encrypted )
values('001', EncryptByPassPhrase('my passphrase','001'))
一切正常
select a.empno,
CONVERT(varchar,(DECRYPTBYPASSPHRASE('my passphrase', a.empno_encrypted))) from encrypt.empsone a
empno no name
001 001
但是连接不起作用
select * from encrypt.empsone a join encrypt.empstwo b
on a.empno_encrypted = b.empno_encrypted
我假设因为加密的值不相同,是否有通过密码加密的选项来实现这一点?我希望我不需要重写所有的连接来使用 decryptbypassphrase 函数
【问题讨论】:
-
为什么需要加密密钥?断章取义,它们应该完全没有意义。
-
它们是外键而不是主键。是的,它们完全没有意义,但有人告诉我它们需要加密。不知道为什么
-
一个表中的外键是其他一些表中的主键(或它们的一部分)。
-
加密区分大小写。这意味着 key、Key 和 KEY 将产生三个不同的加密值。我的猜测是这里正在发生的事情。但是,如果您需要在需要加密的值上连接表,则该设计似乎存在可悲的缺陷。
-
我知道这是您的要求。但我关于区分大小写的观点几乎可以肯定是这里的问题。我至少会推迟一点,要么修复设计,要么不加密不需要的数据。
标签: sql sql-server encryption passphrase