【问题标题】:sqlserver joining on columns that were encrypted by passphrasesqlserver 加入通过密码加密的列
【发布时间】: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


【解决方案1】:

哦,亲爱的,我刚刚意识到您正在使用 EncryptByPassPhrase。每次运行时,它都会生成一个新的对称密钥。因此,每次运行时输出密码都会有所不同。

看看吧。

select EncryptByPassPhrase('my passphrase','001')
    ,  EncryptByPassPhrase('my passphrase','001')

要完成您尝试做的事情,您需要解密该值,这将为您提供您开始使用的值的二进制文件。

select * 
    , decryptbypassphrase('my passphrase', a.empno_encrypted)
    , decryptbypassphrase('my passphrase', b.empno_encrypted)
from empsone a 
join empstwo b on decryptbypassphrase('my passphrase', a.empno_encrypted) = decryptbypassphrase('my passphrase', b.empno_encrypted)

如果您需要取回原始值,只需将 decryptbypassphrase 的结果转换为原始数据类型。

select * 
    , convert(varchar(10), decryptbypassphrase('my passphrase', a.empno_encrypted))
    , convert(varchar(10), decryptbypassphrase('my passphrase', b.empno_encrypted))
from empsone a 
join empstwo b on decryptbypassphrase('my passphrase', a.empno_encrypted) = decryptbypassphrase('my passphrase', b.empno_encrypted)

【讨论】:

  • 是的,试图避免这种情况,所以我不必更改所有存储过程的视图
  • 鉴于您当前加密的性质,您被卡住了。
  • 是的,我想我会尝试始终加密的功能,似乎运行良好。我使用了确定性加密,因此存储过程的视图仍然有效。 .net 实体框架支持它,因此 Web 应用程序仍然可以显示和操作数据
最近更新 更多