欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql如何對已經(jīng)加密的字段進(jìn)行模糊查詢詳解

 更新時(shí)間:2022年09月09日 15:28:18   作者:EvenBoy  
對于密碼等信息可以采用單向加密,驗(yàn)證的時(shí)候用同樣的方式加密匹配即可,下面這篇文章主要給到家介紹了關(guān)于mysql如何對已經(jīng)加密的字段進(jìn)行模糊查詢的相關(guā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)文章

最新評論