mysql 加密解密 AES_ENCRYPT AES_DECRYPT

本文介绍了一种使用AES加密算法来保护数据库中敏感信息的方法。通过将密码字段加密并转换为16进制字符串存储,确保了数据的安全性。同时,提供了如何在SQL查询中实现解密的示例。

加密

INSERT INTO pmdb.`mm_Sql_service` (strArea,strProject,strCanal,ip,sql_type,sql_name,USER,system_account

,system_word,sql_account,sql_word,strRemark) VALUES ('33333','1231231','渠道1','123','123','123','123'

,'123',HEX(AES_ENCRYPT('123456','system_word')),'aaabbb',HEX(AES_ENCRYPT('123456','sql_word')),'') 

//AES_ENCRYPT 对值为123456的 字段system_word 加密 密钥为system_word    

//HEX把加密完成的二进制字串 转成 16进制存入数据库 

//这样加密并不能支持单引号双引号   如果需要支持 就需要先转成16进制 然后再加密再转成16进制 解密反之


SELECT id, AES_DECRYPT(UNHEX(system_word),'system_word') AS sql_word FROM mm_Sql_service


UNHEX 先把数据库里村的16进制字串 转成2进制 然后进行解密







### 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]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值