我正在使用 sql server 的 EncryptByPassPhrase。但我无法正确使用 where 条件。
DECLARE @login_details TABLE(uid integer,username varchar(10),password varbinary(100))
insert into @login_details(uid,username,password) values(1,'abc',EncryptByPassPhrase('12','XXX'))
insert into @login_details(uid,username,password) values(1,'nvt',EncryptByPassPhrase('12','YYY'))
select * from @login_details --this give all rows from table with encrypted values--
select uid,username,convert(varchar(10), DECRYPTBYPASSPHRASE ('12',password)) as password from @login_details --this gives decrypted values
但是在下面的查询中,我使用了 where 条件,但它不起作用并导致 0 行。为什么?
select uid,username,convert(varchar(10), DECRYPTBYPASSPHRASE ('12',password)) as password from @login_details
where password=EncryptByPassPhrase('12','YYY')
如下查询工作正常。
select uid,username,convert(varchar(10), DECRYPTBYPASSPHRASE ('12',password)) as password from @login_details
where convert(varchar(10), DECRYPTBYPASSPHRASE ('12',password))='YYY'
如果我在 where 条件中包含 encryptbyphrase 命令,为什么会出现问题?
您需要使用有效的条件。原因很容易证明。运行这个:
您每次看到相同的结果吗?不,这是因为加密增加了一些魔法来防止可预测的结果(这被严重过度简化了,但就这个问题而言,这就是 3DES 产生这种症状的方式)。
所以,这样做的方法是先解密,然后比较。
当然,这会破坏密码列的可搜索性(如果它被索引),强制进行全扫描(如果这真的是唯一的谓词)。如果您需要在此列上进行有效搜索(您似乎不太可能只是检查密码是否匹配),您可能需要考虑“锁定”计算/持久/索引列。
顺便说一句,有趣的是,Google 搜索已成为我的 Stack Overflow 答案
encryptbypassphrase where clause
排名第一。