mysql如何对已经加密的字段进行模糊查询详解

目录
  • 问题:但是加密之后我们怎么来查询呢?
  • 1、了解HEX 函数与UNHEX 函数
  • 2、了解AES_ENCRYPT函数与AES_DECRYPT函数
  • java工具类AES加解密同步使用
  • 总结

场景:在模糊查询电话号码的时候,发现电话号码是进行加密过的,而传进来的参数却是明文的

PS:作为一个合格的程序员对用户的一些敏感数据都要进行加密处理操作

比如:姓名、手机号、身份证号等等。

问题:但是加密之后我们怎么来查询呢?

1、客户端一般是这样的

1、了解HEX 函数与UNHEX 函数

HEX 函数:将一个字符串或数字转换为十六进制格式的字符串

UNHEX 函数:执行HEX(str)的逆运算。 即,它将参数中的每对十六进制数字解释为一个数字,并将其转换为该数字表示的字符。 结果字符将作为二进制字符串返回。

演示:

-- 先将mysql字符串转换为十六进制格式的字符串
SELECT HEX("mysql") 

-- 输出结果
6D7973716C

-- 在将上面的字符串转换成二进制字符串
SELECT UNHEX("6D7973716C")

-- 输出结果
mysql

2、了解AES_ENCRYPT函数与AES_DECRYPT函数

1、AES_ENCRYPT函数,这个函数的使用场景是对一些安全性要求比较高的数据使用AES加密,语法为:

AES_ENCRYPT(str,key),其中第一个参数表示要加密的数据,第二参数是对应的key。

2、AES_DECRYPT函数,这个函数是与AES_DECRYPT对应的一个函数,用于解密经过AES_DNCRYPT加密的数据,语法为:AES_DNCRYPT(str,key)。

-- 使用AES_ENCRYPT函数对明文进行加密操作
SELECT AES_ENCRYPT('小王', 'intel1234567890a') FROM dual; 

-- 使用AES_DECRYPT函数密文进行解密操作
SELECT AES_DECRYPT(AES_ENCRYPT('小王', 'intel1234567890a'),'intel1234567890a') FROM dual; 

然后把上面的函数一起结合使用就可以实现模糊查询了

-- 此处使用AES-128-ECB加密模式
--第一个参数(小王)明文 第二个参数(intel1234567890a)为秘钥(需要跟下面java代码对应)
select hex(aes_encrypt("小王","intel1234567890a"))  from dual; --明文加密为密文

--第一个sql加密出来的密文
select aes_decrypt(unhex("密文"),"intel1234567890a") from dual; --密文解密为明文

--模糊查询
select * from table where aes_decrypt(unhex("密文"),"intel1234567890a") like CONCAT('%','明文','%')

有人会问了为什么要使用hex和unhex我直接使用aes_encrypt和aes_decrypt加解密不就行了吗?

因为直接使用aes_encrypt会导致加密出来的结果乱码

java工具类AES加解密同步使用

package com.lezu.springboot.utils;

import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;

import java.nio.charset.StandardCharsets;

/**
 * AES加密方式算法工具类
 * 此处使用AES-128-ECB加密模式,key需要为16位。
 */
public class AesUtils {
    /**
     * KEY 随机的后续可更改
     */
    private static final byte[] key = "intel1234567890a".getBytes(StandardCharsets.UTF_8);
    /**
     * 初始化加密(默认的AES加密方式)
     */
    private static final SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);

    /**
     * 加密
     *
     * @param str 加密之前的字符串
     * @return
     */
    public static String encryptHex(String str) {
        return aes.encryptHex(str);
    }

    /**
     * 解密
     *
     * @param str 加密后的字符串
     * @return
     */
    public static String decryptStr(String str) {
        return aes.decryptStr(str);
    }

    public static void main(String[] args) {
        String plaintext = "小王";
        String ciphertext = "183b2940aa6c6d2d73721415660c64c8";

        String encryptHex = AesUtils.encryptHex(plaintext);
        System.out.println("加密后: " + encryptHex);

        String decryptStr = AesUtils.decryptStr(ciphertext);
        System.out.println("解密后: " + decryptStr);
    }

//    加密后: 183b2940aa6c6d2d73721415660c64c8
//    解密后: 小王
}

总结

到此这篇关于mysql如何对已经加密的字段进行模糊查询的文章就介绍到这了,更多相关mysq对加密字段模糊查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为"张三","张猫三"."三脚猫","唐三藏"等等有"三"的记录全找出来. 另外,如果需要找出u_name中既有"三"又有

  • mysql模糊查询like和regexp小结

    在mysql中实现模糊查询的有like和regexp. ------------------------ like的用法许多人都是知道的,最为常用的情况就是select * from a where name like '%a%'; 其中'%'代表的是任意个字符,它的效果像是正则表达式里的'*',它有几种用法:'a%','%a%','%a',分别表示以什么开头,存在什么以及以什么结尾. 另外也可以使用'_'字符,这表示一个任意字符.效果类似正则表达式里面的'.'. like是对这个字段里面的所有

  • mysql中like % %模糊查询的实现

    1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为"张三","张猫三"."三脚猫","唐三藏"等等有"三"的记录全找出来. 另外,如果需要找出u_name中既有"三"又有"猫"的记录,请使用a

  • MySQL模糊查询用法大全(正则、通配符、内置函数)

    SELECT * from table where username like '%陈哈哈%' and hobby like '%牛逼' 这是一条我们在MySQL中常用到的模糊查询方法,通过通配符%来进行匹配,其实,这只是冰山一角,在MySQL中,支持模糊匹配的方法有很多,且各有各的优点.好了,今天让我带大家一起掀起MySQL的小裙子,看一看模糊查询下面还藏着多少鲜为人知的好东西. 一.MySQL通配符模糊查询(%,_) 1-1. 通配符的分类 "%" 百分号通配符: 表示任何字符出现

  • mysql如何对已经加密的字段进行模糊查询详解

    目录 问题:但是加密之后我们怎么来查询呢? 1.了解HEX 函数与UNHEX 函数 2.了解AES_ENCRYPT函数与AES_DECRYPT函数 java工具类AES加解密同步使用 总结 场景:在模糊查询电话号码的时候,发现电话号码是进行加密过的,而传进来的参数却是明文的 PS:作为一个合格的程序员对用户的一些敏感数据都要进行加密处理操作 比如:姓名.手机号.身份证号等等. 问题:但是加密之后我们怎么来查询呢? 1.客户端一般是这样的 1.了解HEX 函数与UNHEX 函数 HEX 函数:将一

  • 数据库加密字段进行模糊查询详解

    目录 需求 服务器端解密 数据库端解密 字符串分片 代价 密文长度较长 分片长度不能太短 可能有多余结果 需求 对于一些敏感字段,比如手机号码.身份证.地址.银行卡号等,我们在存放进数据库前,可能需要对其进行加密. 大部分情况下,我们只需要支持等值查询.但是如果需要支持模糊查询,那么整段内容整体加密就不具备这个能力. 下面是几种解决办法,场景是我们需要根据手机号码的前缀进行匹配. 服务器端解密 因为服务器肯定是具备解密密文的能力的,因此最简单的方式就是把整个表的密文字段数据拉下来,在服务器端进行

  • MySQL必备基础之分组函数 聚合函数 分组查询详解

    目录 一.简单使用 二.搭配DISTINCT去重 三.COUNT()详细介绍 四.分组查询 一.简单使用 SUM:求和(一般用于处理数值型) AVG:平均(一般用于处理数值型) MAX:最大(也可以用于处理字符串和日期) MIN:最小(也可以用于处理字符串和日期) COUNT:数量(统计非空值的数据个数) 以上分组函数都忽略空NULL值的数据 SELECT SUM(salary) AS 和,AVG(salary) AS 平均,MAX(salary) AS 最大,MIN(salary) AS 最小

  • Mysql| 使用通配符进行模糊查询详解(like,%,_)

    通配符的分类: %百分号通配符: 表示任何字符出现任意次数 (可以是0次). _下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符. like操作符: LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较. 注意: 如果在使用like操作符时,后面的没有使用通用匹配符效果是和=一致的,SELECT * FROM products WHERE products.prod_name like '1000';只能匹配的结果为1000,而不能匹配像JetPack

  • mysql的内连接,左连接和右链接查询详解

    mysql> SELECT * FROM tcount_tbl; +---------------+--------------+ | runoob_author | runoob_count | +---------------+--------------+ | 菜鸟教程 | 10 | | RUNOOB.COM | 20 | | Google | 22 | +---------------+--------------+ 3 rows in set (0.01 sec) mysql> SE

  • php+mysql+ajax实现单表多字段多关键词查询的方法

    本文实例讲述了php+mysql+ajax实现单表多字段多关键词查询的方法.分享给大家供大家参考,具体如下: 单表多字段查询在一些稍微复杂一点的查询中十分有用.这里主要利用MySQL数据库中的concat函数实现单表多字段多关键词查询.并且显示查询结果的表格可根据所选数据表动态生成. html代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title><

  • MySQL通过触发器解决数据库中表的行数限制详解及实例

    MySQL通过触发器解决数据库中表的行数限制详解及实例 最近项目一个需求是对操作日志的数量限制为10万条,超过十万条便删除最旧的那一条,保存数据库中日志数量不超过10万. 当时我的第一想法是通过触发器来做,便在数据库中执行了如下的SQL: delimiter $ create trigger limitLog before insert on OperationLog for each row begin if (select count(*) from OperationLog) > 1000

  • Mysql注入中的outfile、dumpfile、load_file函数详解

    在利用sql注入漏洞后期,最常用的就是通过mysql的file系列函数来进行读取敏感文件或者写入webshell,其中比较常用的函数有以下三个 into dumpfile() into outfile() load_file() 我们本次的测试数据如下 读写文件函数调用的限制 因为涉及到在服务器上写入文件,所以上述函数能否成功执行受到参数 secure_file_priv 的影响.官方文档中的描述如下 翻译一下就是 其中当参数 secure_file_priv 为空时,对导入导出无限制 当值为一

  • MySql学习day03:数据表之间的连接、查询详解

    主键: 关键字:primary key 特点:不能为null,并且唯一. 主键分类: 逻辑主键:例如ID,不代表实际的业务意义,只是用来唯一标识一条记录(推荐) 业务主键:例如username,参与实际的业务逻辑. 主键使用方式: 方式一:     Create table t1(        Id int primary key,        Name varchar(100) ); Insert into t1 values(1,'zs'); Insert into t1 values(

  • MySQL多表查询详解上

    时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由我继续带你回顾MySql的知识吧! 回顾练习资料girls库以及两张表的脚本: 链接: https://pan.baidu.com/s/1bgFrP7dBBwk3Ao755pU4Qg 提取码: ihg7 引题:笛卡尔现象,先来观看一下两张表. SELECT * FROM boys; SELECT *

随机推荐