MYSQL解密查询

在代码中使用AES-CBC模式将内容进行加密存储,

如果IV固定的

--设置会话中的加密模式

SET block_encryption_mode = 'aes-128-cbc';

 

--使用AES-CBC 进行加密

-- 执行加密并把加密内容转为 Base64 格式
-- 【加密前的内容a123456】为加密前的内容
-- 【bbbbbbbbbbbbbbbb】为秘钥(16字节)
-- 【123456789aaaaaaa】为初始向量 IV 值(16字节)
-- 加密操作:加密后的内容为 yV9okiObQo6cI5Wwx/SISP6z93IXZAQU6gZBMXSZ5rk=

SELECT to_base64(AES_ENCRYPT('加密前的内容a123456', 'bbbbbbbbbbbbbbbb', "123456789aaaaaaa"));

 


-- 解密操作

SELECT AES_DECRYPT(from_base64('yV9okiObQo6cI5Wwx/SISP6z93IXZAQU6gZBMXSZ5rk='), 'bbbbbbbbbbbbbbbb', "123456789aaaaaaa");

 

如果使用IV随机向量进行加密:

--定义一个解密函数
DELIMITER // CREATE FUNCTION decrypt(encrypted_data TEXT, key_text TEXT) RETURNS TEXT DETERMINISTIC BEGIN DECLARE key_bytes BLOB; DECLARE combined BLOB; DECLARE iv BLOB; DECLARE cipher_text BLOB; DECLARE decrypted_data BLOB; -- 解码Base64密钥 SET key_bytes = FROM_BASE64(key_text); -- 检查密钥长度是否为16字节 IF LENGTH(key_bytes) != 16 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid AES key length: must be 16 bytes'; END IF; -- 解码加密数据 SET combined = FROM_BASE64(encrypted_data); -- 分离IV(前16字节)和密文 SET iv = SUBSTRING(combined, 1, 16); SET cipher_text = SUBSTRING(combined, 17); -- 使用AES解密 (CBC模式) SET decrypted_data = AES_DECRYPT(cipher_text, key_bytes, iv); -- 返回解密后的字符串 RETURN CONVERT(decrypted_data USING utf8mb4); END //

查询解密:

SELECT
    encrypt,
    decrypt(encrypt, '密钥') AS decrypted_content
FROM 
    my_table;

 

posted @ 2025-04-25 15:36  ACCA  阅读(5)  评论(0)    收藏  举报