【问题标题】:Mysql/MariaDB search thru AES Encrypted dataMysql/MariaDB 通过 AES 加密数据搜索
【发布时间】:2021-06-29 11:39:00
【问题描述】:

我有一个表,其中包含 aes 加密数据,并希望通过其中包含 LIKE 的 select 语句进行搜索。现在因为我必须先解密它,所以我使用HAVING,但由于某种原因,LIKE 区分大小写。我已经在数据周围尝试过推杆LOWER(),但这似乎并没有改变这种情况。

SELECT fd.id, AES_DECRYPT(fd.data, 'mysecretkey') AS data
FROM field_data fd
HAVING LOWER(data) LIKE '%test%'

【问题讨论】:

    标签: mysql encryption mariadb sql-like having


    【解决方案1】:

    您可以使用不区分大小写的排序规则

    CREATE TABLE field_data (id int,data  BLOB)
    
    INSERT INTO field_data
    VALUES (1,AES_ENCRYPT('testmedata', UNHEX(SHA2('My secret passphrase',512))))
    ,(2,AES_ENCRYPT('TESTmedata', UNHEX(SHA2('My secret passphrase',512))));
    
    SELECT fd.id, AES_DECRYPT(fd.data, UNHEX(SHA2('My secret passphrase',512))) AS decdata
    FROM field_data fd
    HAVING decdata  LIKE '%test%' COLLATE utf8mb4_general_ci
    
    编号 |解码数据 -: | :--------- 1 |测试数据 2 |测试数据

    db小提琴here

    【讨论】:

    • 谢谢,这正是我想要的! :D
    • 请问为什么是 blob 而不是 text/longtext?
    • 在线系统报错当为文本为AES_ENCRYPT返回二进制时
    • 注意:您可以使用列类型TEXT 并使用TO_BASE64()FROM_BASE64() 将加密二进制作为字符串,但最后,当您使用SELECT AES_DECRYPT(FROM_BASE64()) 搜索时,它将变成二进制和无论如何都必须与CALLATE xxx 一起使用。对此答案投了赞成票。
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2012-12-18
    • 2021-01-14
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2011-12-02
    • 2016-09-27
    相关资源
    最近更新 更多