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