sqlserver加入通过密码加密的列

时间:2019-03-01 19:42:22

标签: sql sql-server encryption passphrase

我需要使用通过密码加密方法对几列进行加密。不幸的是,这些加密的列需要在彼此的联接中使用。而且有许多视图存储了proc等,而我不想修改。

如果您想尝试一下,这是下面的东西 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函数

1 个答案:

答案 0 :(得分:0)

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

看看。

voucher

要完成您要执行的操作,需要解密该值,该值将为您提供开始时使用的值的二进制文件。

User::getVoucherRelation()->where(mid(created_at,1,4),'=',$value)->get();
Model_name::Relation()->where(mid(column_name,1,6),'=',$value)->get();

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

select EncryptByPassPhrase('my passphrase','001')
    ,  EncryptByPassPhrase('my passphrase','001')
相关问题