【问题标题】:CONCAT + TRIM no longer working after encryptionCONCAT + TRIM 加密后不再工作
【发布时间】:2018-11-07 09:01:04
【问题描述】:

由于在我的数据库中加密了某些信息,我在使用现有的搜索功能时遇到了很大的困难。它的功能是按名字、姓氏或两个名字搜索学生表。

旧的工作代码如下:

SELECT *
FROM students
WHERE CONCAT(TRIM(firstname), ' ', TRIM(lastname)) LIKE '%$result%'
AND currentyear = $currentyear
ORDER BY students.lastname

加密后新的无效代码:

SELECT *, 
       AES_DECRYPT(firstname,UNHEX(SHA2('',512))) AS stfirst,
       AES_DECRYPT(lastname,UNHEX(SHA2('',512))) AS stlast
FROM students
WHERE CONCAT(TRIM(stfirst), ' ', TRIM(stlast)) LIKE '%$result%'
AND currentyear = $currentyear
ORDER BY stlast

我在这里错过了什么非常愚蠢的东西吗?谢谢。

【问题讨论】:

  • 请不要输入密码,现在在您的实时实例中更改密码。
  • 为什么要加密表中的数据?现在使用的查询将非常低效,并且无法使用索引
  • 我必须为新的欧洲 GDPR 法规加密数据。
  • 不过,将您的 $result 拆分为两个(?)部分可能更有意义,并对它们进行加密,以便您可以将它们与已经加密的列内容进行比较......(这可能会留下修剪的问题,但为什么当数据开始插入时没有应用?如果此时忽略,也许是时候首先触发解密-修剪-加密更新查询了。)
  • 请标记您正在使用的数据库。

标签: php sql database concat trim


【解决方案1】:

你不能在 where 条件下使用选择别名 .. 你应该重复代码

如果你想比较加密的值,你还应该加密匹配的值

最后尝试使用 concat('%', $result,'%') 而不是 '%$result%'

SELECT *
  , AES_DECRYPT(firstname,UNHEX(SHA2('',512))) AS stfirst
  , AES_DECRYPT(lastname,UNHEX(SHA2('',512))) AS stlast
FROM students
WHERE CONCAT(TRIM(AES_DECRYPT(firstname,UNHEX(SHA2('',512)))), ' ', 
              TRIM(AES_DECRYPT(lastname,UNHEX(SHA2('',512))))) 
              LIKE TRIM(AES_DECRYPT( concat('%', $result,'%'),
                          UNHEX(SHA2('',512)))))
AND currentyear = $currentyear
ORDER BY stlast

【讨论】:

  • 我已经尝试过这个并且刚刚又这样做了,但恐怕这也不起作用。
  • “不工作”是什么意思?...你有错误吗?显示错误信息..错误的结果?显示预期结果和实际结果
  • 没有错误消息,代码有效,但它提供了 0 个结果。正如我之前所说,由于我一直在使用加密数据,所以问题才停止工作。似乎是解密的问题。
  • 删除 WHERE 子句,查看您在别名 stfirststlast 下选择的值是否包含正确“解码”的名称,如您所愿......?
  • @PhilHowell .. 答案已更新 .. (无论如何,使用别名的 where 工作似乎很奇怪)
【解决方案2】:

大概,您正在使用 MySQL。如果是这样,MySQL 会扩展 SQL,因此您可以使用带有列别名的 HAVING 子句,因此,您可以将查询编写为:

SELECT s.*, 
       AES_DECRYPT(firstname,UNHEX(SHA2('', 512))) AS stfirst,
       AES_DECRYPT(lastname,UNHEX(SHA2('', 512))) AS stlast
FROM students s
WHERE currentyear = $currentyear
HAVING CONCAT(TRIM(stfirst), ' ', TRIM(stlast)) LIKE '%$result%' 
ORDER BY stlast;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多