如何加密数据以便使用LIKE执行SQL查询?

时间:2016-02-16 11:50:40

标签: php sql algorithm encryption encryption-symmetric

请耐心等待,我不是加密专家。我的问题可能很基本,但我搜索了很多,我仍然感到困惑。

在PHP项目中,我需要加密/解密数据库中保存的数据。在之前的项目中,我使用了aes128加密,一切顺利。但现在我有不同的需求。我需要使用运算符LIKE在数据库中执行查询。显然,字符串的一部分的加密不包括在整个字符串的加密中。

谷歌搜索,我意识到我可能必须使用对称密钥算法(如凯撒的密码)。但是我使用php加密库(https://github.com/defuse/php-encryption)进行了测试,得到了以下结果:

  

MAMMA =ÿŸNq!! 83 = S™÷á;Bª¯,óØ???æ%§0%? _†Ÿ& 0c-âÐÜÉ/:LSçï; Õμ嬣§.öÒ9

     

MAMMAMIA =(ÒÎ{yG:[&¶>J'Õ6÷ííG£V {ÉsÙ=qÝ×。:ÍÔj...Qž¹×j¶óóþ¡ÔnÛŠ*ån\ hhN

第一个字的加密不包括在第二个字的加密中。显然,simmetric算法不适合我的需要。

使用PHP可以用什么来实现我的目标?谢谢!

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用mysql加密/解密功能并同时执行这两项操作"。

插入和加密数据:

insert into mytable (secret) values AES_ENCRYPT('SomeTextToHide','myPassword');

使用like

搜索加密值
select * from mytable where AES_DECRYPT(secret,'myPassword') like '%text%';

答案 1 :(得分:0)

能够在安全加密数据上使用LIKE子句及其通配符的目标是一组两个相互排斥的欲望。

您可以安全地加密数据,也可以使用带通配符的LIKE子句。您不能同时执行这两项操作,因为LIKE子句本身会绕过加密!

SELECT * WHERE data LIKE 'a%'
SELECT * WHERE data LIKE 'b%'
...
SELECT * WHERE data LIKE '_a%'
SELECT * WHERE data LIKE '_b%'
...
SELECT * WHERE data LIKE '__a%'
SELECT * WHERE data LIKE '__b%'
...

如果您安全地加密数据库中的数据,则需要将其全部拉回本地,解密所有数据,然后对解密数据进行通配符搜索。