我需要使用通过密码加密方法对几列进行加密。不幸的是,这些加密的列需要在彼此的联接中使用。而且有许多视图存储了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函数
答案 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')