MYSQL加密解密 中文、数字 AES_ENCRYPT,AES_DECRYPT

本文详细介绍了如何在MySQL中使用AES_ENCRYPT和AES_DECRYPT进行数据加密解密,特别关注了中文字符的处理,通过Base64和Hex编码解决乱码问题,并提供了实例演示。

MYSQL加密解密AES_ENCRYPT,AES_DECRYPT

废话不多说,先演示非中文方式

错误示范:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

直接看效果
加密
SELECT AES_ENCRYPT("123abc","key") FROM DUAL;
结果
诤=钿巫?V极Ш

将上述乱码解密
SELECT AES_DECRYPT("诤=钿巫?V极Ш","key") FROM DUAL;
结果
NULL

正确用法:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
使用TO_BASE64,FROM_BASE64或者 HEX,UNHEX(16进制转换)
SELECT TO_BASE64(AES_ENCRYPT("123abc","key")) FROM DUAl
结果
2ro97uTO1+U7/uJWvKunug==
解密
SELECT AES_DECRYPT(FROM_BASE64("2ro97uTO1+U7/uJWvKunug=="),"key") FROM DUAL;
结果
123abc

但是上述方法对中文读取还是会存在乱码
存储带中文的字符:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
接下来用HEX演示,和to_base64一样
加密
SELECT HEX(AES_ENCRYPT("123abc张三","key")) FROM DUAL
结果
90CAC577B7E1E2F31A5403A68DA168F0
解密
SELECT CONVERT(AES_DECRYPT(UNHEX("90CAC577B7E1E2F31A5403A68DA168F0"),"key") USING UTF8MB4) FROM DUAL;
结果
123张三
注意后面的编码需要和数据库一致

### MySQLAES_ENCRYPTAES_DECRYPT 的使用方法 在 MySQL 中,`AES_ENCRYPT()` 和 `AES_DECRYPT()` 是用于 SQL 级别加密的函数。这些函数允许对数据库中的特定字段进行加密和解密操作,从而保护敏感数据[^1]。 #### 函数定义 - **AES_ENCRYPT(str, key_str)** - 参数: - `str`:需要加密的字符串。 - `key_str`:加密密钥,可以是任意长度的字符串,但推荐使用固定长度(如16、24或32字节)以匹配 AES 加密标准。 - 返回值:二进制格式的加密数据。 - **AES_DECRYPT(crypt_str, key_str)** - 参数: - `crypt_str`:通过 `AES_ENCRYPT()` 加密后的二进制数据。 - `key_str`:与加密时相同的密钥。 - 返回值:解密后的原始字符串。如果密钥不匹配或输入无效,则返回 `NULL`。 #### 示例代码 以下是一个简单的示例,展示如何在 MySQL 中使用 `AES_ENCRYPT()` 和 `AES_DECRYPT()`: ```sql -- 创建测试表 CREATE TABLE encrypted_data ( id INT PRIMARY KEY, sensitive_info VARBINARY(255) ); -- 插入加密数据 INSERT INTO encrypted_data (id, sensitive_info) VALUES (1, AES_ENCRYPT('敏感数据', '密钥123')); -- 查询并解密数据 SELECT id, AES_DECRYPT(sensitive_info, '密钥123') AS decrypted_info FROM encrypted_data; ``` #### 注意事项 1. **密钥管理**:确保密钥的安全性,避免泄露。密钥通常存储在安全的地方,而不是直接写入 SQL 查询中。 2. **数据类型**:`AES_ENCRYPT()` 返回的是二进制数据 (`BLOB` 或 `VARBINARY`),因此需要选择合适的列类型来存储加密结果。 3. **填充方式**:MySQL 使用 PKCS#5 填充方式自动处理不足块大小的数据[^1]。 #### Python 实现对比 虽然 MySQL 提供了内置的 AES 加密功能,但在某些场景下可能需要在应用层实现类似的功能。以下是基于 Python 的 AES 加密/解密实现[^2]: ```python from Crypto.Cipher import AES from Crypto.Random import get_random_bytes from Crypto.Util.Padding import pad, unpad def aes_encrypt(data, key): cipher = AES.new(key, AES.MODE_CBC) ct_bytes = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size)) return cipher.iv + ct_bytes def aes_decrypt(encrypted_data, key): iv = encrypted_data[:AES.block_size] ct = encrypted_data[AES.block_size:] cipher = AES.new(key, AES.MODE_CBC, iv) pt = unpad(cipher.decrypt(ct), AES.block_size) return pt.decode('utf-8') # 示例 key = get_random_bytes(16) # AES-128 data = "敏感数据需要加密" encrypted = aes_encrypt(data, key) decrypted = aes_decrypt(encrypted, key) print(f"原始数据: {data}") print(f"解密后数据: {decrypted}") ``` #### 静态加密与动态加密的区别 静态加密指的是对数据库文件本身进行加密,防止未经授权的访问。而 SQL 级别的加密(如 `AES_ENCRYPT()` 和 `AES_DECRYPT()`)仅针对特定字段,适合保护敏感信息[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值