MySQL 数据加密整改文档(TDE + 字段加密 + 密码哈希)
适用环境:
- MySQL 版本:8.0.26
- 数据库:
hnp - 关键表:
sys_user - 存储路径示例:
/mnt/sdc/mysql
1. 背景与问题
等保测评要求:
安全控制点:数据保密性
控制项:应采用密码技术保证重要数据在存储过程中的保密性,包括但不限于鉴别数据、重要业务数据和重要个人信息等。
核查结果:
- MySQL 数据库未采用校验技术或密码技术保证鉴别数据、个人信息、业务数据在存储过程中的保密性。
- 符合情况:不符合
整改目标:
- 确保数据库在静态存储层(表空间)加密,防止数据文件泄露。
- 对鉴别数据(如密码)进行哈希处理,防止明文存储。
- 对敏感字段(如手机号、身份证号)可选字段级加密。
2. 解决方案
方案一:透明数据加密(TDE)
- 加密整个表空间文件,不影响应用查询。
- MySQL 内部自动加解密,SQL 查询结果仍为明文。
- 防止数据文件被拷贝后泄露。
方案二:字段级加密(AES/SM4)
- 针对敏感字段加密,如身份证号、手机号等。
- 插入数据需用
AES_ENCRYPT(),查询时用AES_DECRYPT()。 - 适合对 DB 管理员或 SQL 层不可见的数据。
方案三:鉴别数据哈希(SHA512)
- 密码字段存储哈希值而非明文。
- 可加盐增强安全性。
- 验证时计算哈希比对。
3. 操作步骤(方案一 TDE)
3.1 配置 keyring 插件
在 /etc/my.cnf 添加:
[mysqld]
early-plugin-load=keyring_file.so
keyring_file_data=/var/lib/mysql-keyring/keyring
可修改
keyring_file_data路径到安全目录,如/mnt/sdc/mysql/keyring
3.2 重启 MySQL
systemctl restart mysqld
3.3 验证 keyring 插件
SHOW PLUGINS LIKE 'keyring%';
输出示例:
+---------------+--------+-------+---------+---------+ | Name | Status | Type | Library | License | +---------------+--------+-------+---------+---------+ | keyring_file | ACTIVE | KEYRING | NULL | GPL | +---------------+--------+-------+---------+---------+
3.4 给表启用加密
ALTER TABLE hnp.sys_user ENCRYPTION='Y';
3.5 验证表是否加密
SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'hnp' AND TABLE_NAME = 'sys_user';
输出示例:
+--------------+-----------+----------------+ | TABLE_SCHEMA | TABLE_NAME| CREATE_OPTIONS | +--------------+-----------+----------------+ | hnp | sys_user | ENCRYPTION='Y' | +--------------+-----------+----------------+
3.6 整库加密查看
SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS
FROM information_schema.tables
WHERE CREATE_OPTIONS LIKE '%ENCRYPTION%';
4. 字段加密示例(可选)
-- 插入敏感字段加密
INSERT INTO hnp.sys_user (name, mobile)
VALUES ('张三', AES_ENCRYPT('13800001234', 'MyStrongKey!'));-- 查询解密
SELECT name, CAST(AES_DECRYPT(mobile, 'MyStrongKey!') AS CHAR) AS mobile
FROM hnp.sys_user;
5. 鉴别数据哈希示例
-- 插入用户密码哈希
INSERT INTO hnp.sys_user (account, pwd_hash)
VALUES ('admin', SHA2('PlainPassword', 512));-- 验证密码
SELECT * FROM hnp.sys_user
WHERE account='admin' AND pwd_hash=SHA2('PlainPassword', 512);
推荐加盐处理:
SHA2(CONCAT('PlainPassword','随机盐'), 512)
6. 验证与报告模板
整改说明(报告用):
已启用 MySQL 透明数据加密(TDE)功能,通过
keyring_file插件加载加密密钥;
对hnp数据库中存储鉴别信息和个人信息的表(如sys_user)执行了ALTER TABLE ... ENCRYPTION='Y'操作,
该表已加密存储。查询验证结果CREATE_OPTIONS='ENCRYPTION=Y',符合数据在存储过程中的保密性要求。
验证SQL:
SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS
FROM information_schema.tables
WHERE TABLE_SCHEMA='hnp' AND TABLE_NAME='sys_user';
验证结果示例:
+--------------+-----------+----------------+
| hnp | sys_user | ENCRYPTION='Y' |
+--------------+-----------+----------------+
符合情况: 已整改,符合要求。
7. 建议
- 对全库表启用 TDE,保护数据文件。
- 对密码字段使用 SHA512 哈希(推荐加盐)。
- 对关键敏感字段,可使用 AES/SM4 加密,额外增强安全性。
- 定期备份 keyring 文件和数据库,防止密钥丢失造成数据不可用。