问题:
对于一些敏感数据,比如用户的手机号、身份证号、银行卡号之类进行加密处理,是一些系统的常用处理方式。但是这保证了数据的安全之外又诞生了另外一个问题,就是搜索这些信息的时候,模糊查询变得困难。
解决方案:
利用mysql 的 AES_ENCRYPT和AES_DECRYPT 方法来处理数据的加密和解密。
写入数据:
INSERT INTO wz_treatment_columns_setting (keywords) VALUES (AES_ENCRYPT('中华人民共和国万岁', 'ICnkuyk9EARDhXHY'));
INSERT INTO wz_treatment_columns_setting (keywords) VALUES (AES_ENCRYPT('世界人民大团结万岁', 'ICnkuyk9EARDhXHY'));
查询数据:
SELECT * FROM wz_treatment_columns_setting WHERE AES_DECRYPT(keywords, 'ICnkuyk9EARDhXHY') LIKE '%世界%';
注意事情:
keywords 不能是 varchar 需要是 varbinary
优化:
为了数据显示更友好,可以增加 hex 和 unhex 函数
插入数据:
INSERT INTO wz_treatment_columns_setting (keywords) VALUES (hex(AES_ENCRYPT('中华人民共和国万岁', 'ICnkuyk9EARDhXHY')));
INSERT INTO wz_treatment_columns_setting (keywords) VALUES (hex(AES_ENCRYPT('世界人民大团结万岁', 'ICnkuyk9EARDhXHY')));
查询数据:
SELECT * FROM wz_treatment_columns_setting WHERE AES_DECRYPT(UNHEX(keywords), 'ICnkuyk9EARDhXHY') LIKE '%世界%';