请耐心等待,我不是加密专家。我的问题可能很基本,但我搜索了很多,我仍然感到困惑。
在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可以用什么来实现我的目标?谢谢!
答案 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%'
...
如果您安全地加密数据库中的数据,则需要将其全部拉回本地,解密所有数据,然后对解密数据进行通配符搜索。