mysql如何對已經(jīng)加密的字段進行模糊查詢詳解
場景:在模糊查詢電話號碼的時候,發(fā)現(xiàn)電話號碼是進行加密過的,而傳進來的參數(shù)卻是明文的
PS:作為一個合格的程序員對用戶的一些敏感數(shù)據(jù)都要進行加密處理操作
比如:姓名、手機號、身份證號等等。
問題:但是加密之后我們怎么來查詢呢?

1、客戶端一般是這樣的

1、了解HEX 函數(shù)與UNHEX 函數(shù)
HEX 函數(shù):將一個字符串或數(shù)字轉(zhuǎn)換為十六進制格式的字符串
UNHEX 函數(shù):執(zhí)行HEX(str)的逆運算。 即,它將參數(shù)中的每對十六進制數(shù)字解釋為一個數(shù)字,并將其轉(zhuǎn)換為該數(shù)字表示的字符。 結(jié)果字符將作為二進制字符串返回。
演示:
-- 先將mysql字符串轉(zhuǎn)換為十六進制格式的字符串
SELECT HEX("mysql")
-- 輸出結(jié)果
6D7973716C
-- 在將上面的字符串轉(zhuǎn)換成二進制字符串
SELECT UNHEX("6D7973716C")
-- 輸出結(jié)果
mysql2、了解AES_ENCRYPT函數(shù)與AES_DECRYPT函數(shù)
1、AES_ENCRYPT函數(shù),這個函數(shù)的使用場景是對一些安全性要求比較高的數(shù)據(jù)使用AES加密,語法為:
AES_ENCRYPT(str,key),其中第一個參數(shù)表示要加密的數(shù)據(jù),第二參數(shù)是對應(yīng)的key。
2、AES_DECRYPT函數(shù),這個函數(shù)是與AES_DECRYPT對應(yīng)的一個函數(shù),用于解密經(jīng)過AES_DNCRYPT加密的數(shù)據(jù),語法為:AES_DNCRYPT(str,key)。
-- 使用AES_ENCRYPT函數(shù)對明文進行加密操作
SELECT AES_ENCRYPT('小王', 'intel1234567890a') FROM dual;
-- 使用AES_DECRYPT函數(shù)密文進行解密操作
SELECT AES_DECRYPT(AES_ENCRYPT('小王', 'intel1234567890a'),'intel1234567890a') FROM dual; 然后把上面的函數(shù)一起結(jié)合使用就可以實現(xiàn)模糊查詢了
-- 此處使用AES-128-ECB加密模式
--第一個參數(shù)(小王)明文 第二個參數(shù)(intel1234567890a)為秘鑰(需要跟下面java代碼對應(yīng))
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會導(dǎo)致加密出來的結(jié)果亂碼

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 隨機的后續(xù)可更改
*/
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
// 解密后: 小王
}總結(jié)
到此這篇關(guān)于mysql如何對已經(jīng)加密的字段進行模糊查詢的文章就介紹到這了,更多相關(guān)mysq對加密字段模糊查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL字符型字段按數(shù)字型字段排序?qū)崿F(xiàn)方法
由于是按字母順序排列,所以123排在了2的前面,顯然不符合我們的要求,那么怎樣才能按照我們預(yù)想的數(shù)字順序排序呢2013-03-03
Win7 64位 mysql 5.7下載安裝常見問題小結(jié)
這篇文章主要介紹了Win7 64位 mysql 5.7下載安裝常見問題小結(jié),本文圖文并茂給大家介紹的非常詳細,需要的朋友參考下吧2017-06-06
提升MySQL查詢效率及查詢速度優(yōu)化的四個方法詳析
查詢語句的優(yōu)化是提高MySQL查詢速度的重要方法,可以通過使用JOIN語句、子查詢、優(yōu)化where子句等方式來減少查詢的時間,下面這篇文章主要給大家介紹了關(guān)于提升MySQL查詢效率及查詢速度優(yōu)化的四個方法,需要的朋友可以參考下2023-04-04

