mysql字段加解密
时间: 2023-11-19 16:04:09 浏览: 94
MySQL提供了AES_ENCRYPT()和AES_DECRYPT()函数来进行字段加解密。具体用法如下:
加密:AES_ENCRYPT('字段值',密钥);
解密:AES_DECRYPT('加密后字段值',密钥)
注意:加密和解密都需要用到密钥,加解密对应数据需要相同的密钥。
举例:
在user表中有两个字段,手机号:MOBILE,手机号加密结果:MOBILE_ENCRYPT。现需要将用户的手机号加密存储,方法为:
insert into user_info (ID,MOBILE,MOBILE_ENCRYPT) values (1,'13666666666',AES_ENCRYPT('13666666666','abc'));
解密:
select ID,MOBILE,AES_DECRYPT(MOBILE_ENCRYPT,'abc') from user_info where ID=1;
如果出现加密插入时报Incorrect string value: '\x94\xED\xC7\x8Alx...' for column 'MOBILE_ENCRYPT' at row 1的错误,可能是因为数据库的编码问题。可以修改数据库表编码格式为utf8mb4或将加密后的密文十六进制化再存入varchar/char列,使用HEX()来存入,用UNHEX()取出。
另外,加密后数据长度会增长,需要注意字段长度设置。
相关问题
在mysql创建加密字段
在MySQL中,你可以通过使用`AES_ENCRYPT()`和`AES_DECRYPT()`函数来存储加密的数据。这通常是在`VARCHAR`或`TEXT`类型字段上操作,因为它们支持字符串输入。以下是创建包含加密数据的字段的基本步骤:
1. 创建表时,在列定义中指定加密类型,例如:
```sql
CREATE TABLE users (
id INT PRIMARY KEY,
password VARCHAR(255) NOT NULL,
encrypted_password VARBINARY(255)
);
```
`encrypted_password`是一个二进制类型的字段用于存储加密后的密码。
2. 插入数据时,先对明文进行加密:
```sql
INSERT INTO users (id, password)
VALUES (1, 'your_password')
ON DUPLICATE KEY UPDATE encrypted_password = AES_ENCRYPT(password, 'your_secret_key');
```
使用相同的密钥`your_secret_key`来保证解密时可以匹配。
3. 查询时,如果需要查看数据,会直接看到加密后的值,除非你需要解密:
```sql
SELECT id, encrypted_password FROM users;
```
4. 解密数据时(例如登录时),需要使用相同的密钥:
```sql
SELECT AES_DECRYPT(encrypted_password, 'your_secret_key') AS decrypted_password FROM users WHERE id = 1;
```
请注意,`AES_ENCRYPT()`和`AES_DECRYPT()`不是MySQL的标准内置函数,而是MySQL加壳插件如MariaDB或者第三方软件提供的。另外,妥善管理密钥非常重要,因为它决定了数据的安全性。
mysql加密字段模糊查询
MySQL中的加密字段(如通过`AES_ENCRYPT()`函数加密的数据)在做模糊查询(如`LIKE`, `ILIKE`, 或 `%`操作符)时会遇到一些挑战,因为这些运算通常不会直接作用于加密后的数据。当你试图对加密字段进行模糊搜索时,你需要先解密数据然后再执行查询。
你可以采用以下步骤来进行模糊查询:
1. **预处理和解密**:
使用存储过程或触发器,在用户输入之前解密数据。然后将解密后的字符串进行模糊匹配操作。
```sql
DELIMITER //
CREATE PROCEDURE SearchEncryptedField(IN search_term VARCHAR(255))
BEGIN
DECLARE decrypted_value VARBINARY(255);
SET decrypted_value = AES_DECRYPT(your_encrypted_field, your_key);
SELECT * FROM your_table WHERE UNHEX(decode_string) LIKE CONCAT('%', search_term, '%');
END; //
DELIMITER ;
```
这里假设`your_encrypted_field`是加密字段,`your_key`是用于解密的密钥,`UNHEX(decode_string)`是为了适配MySQL的字符串比较。
2. **查询执行**:
调用存储过程并传入用户的搜索词。
```sql
CALL SearchEncryptedField('your_search_text');
```
然而,这种方法存在性能开销,因为它每次查询都需要解密整个表的一部分。如果数据量大,可能会造成性能瓶颈。另外,如果频繁解密操作对安全性有顾虑,可以考虑使用全文索引来提高搜索效率。
阅读全文