mysql如何對(duì)已經(jīng)加密的字段進(jìn)行模糊查詢?cè)斀?/h1>
更新時(shí)間:2022年09月09日 15:28:18 作者:EvenBoy
對(duì)于密碼等信息可以采用單向加密,驗(yàn)證的時(shí)候用同樣的方式加密匹配即可,下面這篇文章主要給到家介紹了關(guān)于mysql如何對(duì)已經(jīng)加密的字段進(jìn)行模糊查詢的相關(guān)資料,需要的朋友可以參考下
場(chǎng)景:在模糊查詢電話號(hào)碼的時(shí)候,發(fā)現(xiàn)電話號(hào)碼是進(jìn)行加密過(guò)的,而傳進(jìn)來(lái)的參數(shù)卻是明文的
PS:作為一個(gè)合格的程序員對(duì)用戶的一些敏感數(shù)據(jù)都要進(jìn)行加密處理操作
比如:姓名、手機(jī)號(hào)、身份證號(hào)等等。
問(wèn)題:但是加密之后我們?cè)趺磥?lái)查詢呢?

1、客戶端一般是這樣的

1、了解HEX 函數(shù)與UNHEX 函數(shù)
HEX 函數(shù):將一個(gè)字符串或數(shù)字轉(zhuǎn)換為十六進(jìn)制格式的字符串
UNHEX 函數(shù):執(zhí)行HEX(str)的逆運(yùn)算。 即,它將參數(shù)中的每對(duì)十六進(jìn)制數(shù)字解釋為一個(gè)數(shù)字,并將其轉(zhuǎn)換為該數(shù)字表示的字符。 結(jié)果字符將作為二進(jìn)制字符串返回。
演示:
-- 先將mysql字符串轉(zhuǎn)換為十六進(jìn)制格式的字符串
SELECT HEX("mysql")
-- 輸出結(jié)果
6D7973716C
-- 在將上面的字符串轉(zhuǎn)換成二進(jìn)制字符串
SELECT UNHEX("6D7973716C")
-- 輸出結(jié)果
mysql
2、了解AES_ENCRYPT函數(shù)與AES_DECRYPT函數(shù)
1、AES_ENCRYPT函數(shù),這個(gè)函數(shù)的使用場(chǎng)景是對(duì)一些安全性要求比較高的數(shù)據(jù)使用AES加密,語(yǔ)法為:
AES_ENCRYPT(str,key),其中第一個(gè)參數(shù)表示要加密的數(shù)據(jù),第二參數(shù)是對(duì)應(yīng)的key。
2、AES_DECRYPT函數(shù),這個(gè)函數(shù)是與AES_DECRYPT對(duì)應(yīng)的一個(gè)函數(shù),用于解密經(jīng)過(guò)AES_DNCRYPT加密的數(shù)據(jù),語(yǔ)法為:AES_DNCRYPT(str,key)。
-- 使用AES_ENCRYPT函數(shù)對(duì)明文進(jìn)行加密操作
SELECT AES_ENCRYPT('小王', 'intel1234567890a') FROM dual;
-- 使用AES_DECRYPT函數(shù)密文進(jìn)行解密操作
SELECT AES_DECRYPT(AES_ENCRYPT('小王', 'intel1234567890a'),'intel1234567890a') FROM dual;
然后把上面的函數(shù)一起結(jié)合使用就可以實(shí)現(xiàn)模糊查詢了
-- 此處使用AES-128-ECB加密模式
--第一個(gè)參數(shù)(小王)明文 第二個(gè)參數(shù)(intel1234567890a)為秘鑰(需要跟下面java代碼對(duì)應(yīng))
select hex(aes_encrypt("小王","intel1234567890a")) from dual; --明文加密為密文
--第一個(gè)sql加密出來(lái)的密文
select aes_decrypt(unhex("密文"),"intel1234567890a") from dual; --密文解密為明文
--模糊查詢
select * from table where aes_decrypt(unhex("密文"),"intel1234567890a") like CONCAT('%','明文','%')
有人會(huì)問(wèn)了為什么要使用hex和unhex我直接使用aes_encrypt和aes_decrypt加解密不就行了嗎?
因?yàn)橹苯邮褂?strong>aes_encrypt會(huì)導(dǎo)致加密出來(lái)的結(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 隨機(jī)的后續(xù)可更改
*/
private static final byte[] key = "intel1234567890a".getBytes(StandardCharsets.UTF_8);
/**
* 初始化加密(默認(rèn)的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如何對(duì)已經(jīng)加密的字段進(jìn)行模糊查詢的文章就介紹到這了,更多相關(guān)mysq對(duì)加密字段模糊查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
-
在IntelliJ IDEA中使用Java連接MySQL數(shù)據(jù)庫(kù)的方法詳解
這篇文章主要介紹了在IntelliJ IDEA中使用Java連接MySQL數(shù)據(jù)庫(kù)的方法詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2020-10-10
-
mysql根據(jù)拼音字母查詢(簡(jiǎn)單易懂的字段拼音查詢)
MySQL在開(kāi)發(fā)中,我們經(jīng)常需要根據(jù)字段拼音查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù),它支持多種查詢方式,包括根據(jù)拼音字母查詢,使用 Collation 可以方便地進(jìn)行簡(jiǎn)單的拼音查詢,而使用拼音索引可以大幅提高查詢性能,根據(jù)具體的需求和情況,我們可以選擇合適的方法來(lái)實(shí)現(xiàn)拼音查詢 2023-10-10
-
mysql將數(shù)據(jù)庫(kù)中所有表結(jié)構(gòu)和數(shù)據(jù)導(dǎo)入到另一個(gè)庫(kù)的方法(親測(cè)有效)
這篇文章主要給大家介紹了關(guān)于mysql將數(shù)據(jù)庫(kù)中所有表結(jié)構(gòu)和數(shù)據(jù)導(dǎo)入到另一個(gè)庫(kù)的方法,文中通過(guò)代碼介紹的非常詳細(xì),親測(cè)有效,對(duì)同樣遇到這個(gè)需求的朋友具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2024-01-01
-
mysql的case when字段為空,null的問(wèn)題
這篇文章主要介紹了mysql的case when字段為空,null的問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2022-12-12
-
Mysql兩種情況下更新字段中部分?jǐn)?shù)據(jù)的方法
Mysql更新字段中部分?jǐn)?shù)據(jù)的兩種情況在下文給予詳細(xì)的解決方法,感興趣的朋友可以參考下哈 2013-05-05
最新評(píng)論
場(chǎng)景:在模糊查詢電話號(hào)碼的時(shí)候,發(fā)現(xiàn)電話號(hào)碼是進(jìn)行加密過(guò)的,而傳進(jìn)來(lái)的參數(shù)卻是明文的
PS:作為一個(gè)合格的程序員對(duì)用戶的一些敏感數(shù)據(jù)都要進(jìn)行加密處理操作
比如:姓名、手機(jī)號(hào)、身份證號(hào)等等。
問(wèn)題:但是加密之后我們?cè)趺磥?lái)查詢呢?
1、客戶端一般是這樣的
1、了解HEX 函數(shù)與UNHEX 函數(shù)
HEX 函數(shù):將一個(gè)字符串或數(shù)字轉(zhuǎn)換為十六進(jìn)制格式的字符串
UNHEX 函數(shù):執(zhí)行HEX(str)的逆運(yùn)算。 即,它將參數(shù)中的每對(duì)十六進(jìn)制數(shù)字解釋為一個(gè)數(shù)字,并將其轉(zhuǎn)換為該數(shù)字表示的字符。 結(jié)果字符將作為二進(jìn)制字符串返回。
演示:
-- 先將mysql字符串轉(zhuǎn)換為十六進(jìn)制格式的字符串 SELECT HEX("mysql") -- 輸出結(jié)果 6D7973716C -- 在將上面的字符串轉(zhuǎn)換成二進(jìn)制字符串 SELECT UNHEX("6D7973716C") -- 輸出結(jié)果 mysql
2、了解AES_ENCRYPT函數(shù)與AES_DECRYPT函數(shù)
1、AES_ENCRYPT函數(shù),這個(gè)函數(shù)的使用場(chǎng)景是對(duì)一些安全性要求比較高的數(shù)據(jù)使用AES加密,語(yǔ)法為:
AES_ENCRYPT(str,key),其中第一個(gè)參數(shù)表示要加密的數(shù)據(jù),第二參數(shù)是對(duì)應(yīng)的key。
2、AES_DECRYPT函數(shù),這個(gè)函數(shù)是與AES_DECRYPT對(duì)應(yīng)的一個(gè)函數(shù),用于解密經(jīng)過(guò)AES_DNCRYPT加密的數(shù)據(jù),語(yǔ)法為:AES_DNCRYPT(str,key)。
-- 使用AES_ENCRYPT函數(shù)對(duì)明文進(jìn)行加密操作 SELECT AES_ENCRYPT('小王', 'intel1234567890a') FROM dual; -- 使用AES_DECRYPT函數(shù)密文進(jìn)行解密操作 SELECT AES_DECRYPT(AES_ENCRYPT('小王', 'intel1234567890a'),'intel1234567890a') FROM dual;
然后把上面的函數(shù)一起結(jié)合使用就可以實(shí)現(xiàn)模糊查詢了
-- 此處使用AES-128-ECB加密模式 --第一個(gè)參數(shù)(小王)明文 第二個(gè)參數(shù)(intel1234567890a)為秘鑰(需要跟下面java代碼對(duì)應(yīng)) select hex(aes_encrypt("小王","intel1234567890a")) from dual; --明文加密為密文 --第一個(gè)sql加密出來(lái)的密文 select aes_decrypt(unhex("密文"),"intel1234567890a") from dual; --密文解密為明文 --模糊查詢 select * from table where aes_decrypt(unhex("密文"),"intel1234567890a") like CONCAT('%','明文','%')
有人會(huì)問(wèn)了為什么要使用hex和unhex我直接使用aes_encrypt和aes_decrypt加解密不就行了嗎?
因?yàn)橹苯邮褂?strong>aes_encrypt會(huì)導(dǎo)致加密出來(lái)的結(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 隨機(jī)的后續(xù)可更改 */ private static final byte[] key = "intel1234567890a".getBytes(StandardCharsets.UTF_8); /** * 初始化加密(默認(rèn)的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如何對(duì)已經(jīng)加密的字段進(jìn)行模糊查詢的文章就介紹到這了,更多相關(guān)mysq對(duì)加密字段模糊查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在IntelliJ IDEA中使用Java連接MySQL數(shù)據(jù)庫(kù)的方法詳解
這篇文章主要介紹了在IntelliJ IDEA中使用Java連接MySQL數(shù)據(jù)庫(kù)的方法詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10mysql根據(jù)拼音字母查詢(簡(jiǎn)單易懂的字段拼音查詢)
MySQL在開(kāi)發(fā)中,我們經(jīng)常需要根據(jù)字段拼音查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù),它支持多種查詢方式,包括根據(jù)拼音字母查詢,使用 Collation 可以方便地進(jìn)行簡(jiǎn)單的拼音查詢,而使用拼音索引可以大幅提高查詢性能,根據(jù)具體的需求和情況,我們可以選擇合適的方法來(lái)實(shí)現(xiàn)拼音查詢2023-10-10mysql將數(shù)據(jù)庫(kù)中所有表結(jié)構(gòu)和數(shù)據(jù)導(dǎo)入到另一個(gè)庫(kù)的方法(親測(cè)有效)
這篇文章主要給大家介紹了關(guān)于mysql將數(shù)據(jù)庫(kù)中所有表結(jié)構(gòu)和數(shù)據(jù)導(dǎo)入到另一個(gè)庫(kù)的方法,文中通過(guò)代碼介紹的非常詳細(xì),親測(cè)有效,對(duì)同樣遇到這個(gè)需求的朋友具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01mysql的case when字段為空,null的問(wèn)題
這篇文章主要介紹了mysql的case when字段為空,null的問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Mysql兩種情況下更新字段中部分?jǐn)?shù)據(jù)的方法
Mysql更新字段中部分?jǐn)?shù)據(jù)的兩種情況在下文給予詳細(xì)的解決方法,感興趣的朋友可以參考下哈2013-05-05