首頁 > 軟體

mysql如何對已經加密的欄位進行模糊查詢詳解

2022-09-12 18:02:23

場景:在模糊查詢電話號碼的時候,發現電話號碼是進行加密過的,而傳進來的引數卻是明文的

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對加密欄位模糊查詢內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com