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;