mysql数据库中针对敏感信息字段加密处理问题

本文详细介绍了在MySQL中使用AES加密函数对敏感信息进行加密的过程。包括如何在MyBatis的mapper.xml中实现加密与解密,以及如何利用HEX()和UNHEX()函数解决加密后数据的显示问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有这样一个需求,针对系统中的敏感信息,如供应商的手机号码,银行账号等需要做加密处理。比较常见的加密方式如md5,但是公司架构组的给出的方案是:统一在数据库处理,使用mysql的加密函数AES_ENCRYPT(’‘明文,‘加密key’)和解密函数AES_DECRYPT(’'明文,‘加密key’),加密key可配置。

经过一天的更改测试完成,做个总结,记录下此过程中遇到的问题及解决方法。

在原表中增加存储加密信息的字段,如新增字段encrypt_mobile,encrypt_bank_num分别对应之前的mobile,bank_num

处理方案:

1、在常量类中添加静态的常量:

package com.lyc.common.constant;
public class CommonConstant {
	public static final String MYSQL_ENTRYPT_KEY = "entryptkey";
}

2、mybatis的mapper.xml中新增数据的sql更改如下:

insert into table (encrypt_mobile,encrypt_bank_num) 
values(
AES_ENCRYPT(#{encryptMobile},'${@com.lyc.common.constant.CommonConstant@MYSQL_ENTRYPT_KEY}'),
AES_ENCRYPT(#{encryptBankNum},'${@com.lyc.common.constant.CommonConstant@MYSQL_ENTRYPT_KEY}')
);

3、查询手机号、银行账号,在mybatis的mapper.xml中查询sql更改如下:

select AES_DECRYPT(encrypt_mobile,'${@com.lyc.common.constant.CommonConstant@MYSQL_ENTRYPT_KEY}') as mobile,
AES_DECRYPT(encrypt_bank_num,'${@com.lyc.common.constant.CommonConstant@MYSQL_ENTRYPT_KEY}') as bank_num 
from table;

效果如图:
在这里插入图片描述

数据成功加密并保存了,但是看起来像乱码,而且解密返回的结果为null,有问题。查资料发现mysql还有两个函数,HEX()和UNHEX()。HEX()可以将一个字符串或数字转换为十六进制格式的字符串,UNHEX()把十六进制格式的字符串转化为原来的格式。

解决方案:

1、mybatis的mapper.xml中新增数据的sql更改如下:

insert into table (encrypt_mobile,encrypt_bank_num) 
values(
HEX(AES_ENCRYPT(#{encryptMobile},'${@com.lyc.common.constant.CommonConstant@MYSQL_ENTRYPT_KEY}')),
HEX(AES_ENCRYPT(#{encryptBankNum},'${@com.lyc.common.constant.CommonConstant@MYSQL_ENTRYPT_KEY}'))
);

2、查询手机号、银行账号,在mybatis的mapper.xml中查询sql更改如下:

select AES_DECRYPT(UNHEX(encrypt_mobile),'${@com.lyc.common.constant.CommonConstant@MYSQL_ENTRYPT_KEY}') as mobile,
AES_DECRYPT(UNHEX(encrypt_bank_num),'${@com.lyc.common.constant.CommonConstant@MYSQL_ENTRYPT_KEY}') as bank_num
from table;

效果如图:
在这里插入图片描述

解决问题中参考的博客地址:
[1] https://blog.csdn.net/lwwl12/article/details/81502989
[2] http://blog.itpub.net/29773961/viewspace-2142305/
[3] https://blog.csdn.net/oppoppoppo/article/details/53407048

<think>嗯,用户想了解如何在MySQL数据库中对字段进行加密。我之前回答过类似的问题,所以需要先回顾一下之前的引用资料。引用中提到了使用AES_ENCRYPT函数,比如创建表时使用VARBINARY类型存储加密后的数据,插入数据时用AES_ENCRYPT加密,查询时用AES_DECRYPT解密。用户可能想知道具体步骤,比如如何创建表、插入加密数据、查询解密数据,以及需要注意的事项。首先,我需要确定用户是否了解基本的SQL操作,还是需要详细的步骤说明。根据用户的问题,他们可能希望得到一个逐步的指南。所以应该分步骤讲解,包括创建表结构、插入加密数据、查询解密数据,以及密钥管理和加密模式的选择。 然后,考虑用户可能遇到的常见问题,比如加密后的数据类型选择,密钥管理的重要性,性能影响,以及加密模式的选择。这些都需要在回答中提到,帮助用户全面了解。另外,用户可能没有考虑到加密后的数据如何索引和查询,比如模糊查询的问题,以及加密函数的使用限制,比如AES_ENCRYPT需要密钥作为参数。这些也需要提醒用户注意。 还需要参考之前的引用,比如引用1、2、3、4都提到了使用AES_ENCRYPT和创建表时的字段类型为VARBINARY或BLOB。所以需要整合这些信息,给出具体的示例代码,并说明每一步的作用。最后,生成相关问题,帮助用户深入理解,比如如何管理加密密钥,性能优化方法,或者与其他加密方式的比较。这样用户可以根据自己的需求进一步探索。</think>### MySQL数据库字段加密方法分步说明 MySQL提供多种字段加密方式,以下是基于AES算法的加密实现方法: 一、**创建加密字段表结构** ```sql CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50), password VARBINARY(256) -- 存储AES加密后的二进制数据 ); ``` $注意$:加密后的数据建议使用`VARBINARY`/`BLOB`类型存储,避免字符集转换导致数据损坏[^2][^3] 二、**插入加密数据** ```sql INSERT INTO users (username, password) VALUES ( 'alice', AES_ENCRYPT('明文密码', '加密密钥') ); ``` $说明$:`AES_ENCRYPT(明文,密钥)`函数支持128/192/256位密钥长度,建议至少使用32字符长度的密钥(对应256位)[^1] 三、**查询解密数据** ```sql SELECT id, username, AES_DECRYPT(password, '加密密钥') AS 解密密码 FROM users; ``` 四、**密钥管理注意事项** 1. 密钥应通过`SET @key = '密钥内容'`变量传递,避免硬编码 2. 建议结合MySQL的密钥管理插件(如keyring_file) 3. 重要数据应使用HSM硬件安全模块存储密钥[^2] $$加密算法选择矩阵: \begin{array}{|c|c|c|} \hline 算法 & 强度 & 适用场景 \\ \hline AES & 高 & 敏感数据加密 \\ SHA2 & 不可逆 & 密码哈希存储 \\ MD5 & 低 & 临时校验值 \\ \hline \end{array}$$ 五、**加密模式建议** ```sql -- 使用更安全的GCM模式(MySQL 8.0.30+) SELECT AES_ENCRYPT('data', 'key', '块加密模式', 'iv参数'); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值