在Mysql中使用load data infile命令可以快速大批量加载数据到表中

AES_ENCRYPT(value,key)是mysql自带的AES加密命令

如何在使用load data infile加载数据的同时对数据使用AES加密呢?

通过阅读mysql提供的文档可以得到答案:

MySQL :: MySQL 8.0 Reference Manual :: 13.2.9 LOAD DATA Statement

具体命令如下:

1
2
3
4
load data infile '文件路径'
into table '表名'
set '字段1' = AES_ENCRYPT('字段1', '密钥'),
    '字段2' = AES_ENCRYPT('字段2', '密钥');

建议把密钥进行Hash会更安全:

1
2
3
4
load data infile '文件路径'
into table '表名'
set '字段1' = AES_ENCRYPT('字段1', UNHEX(SHA2('密钥',512))),
    '字段2' = AES_ENCRYPT('字段2', UNHEX(SHA2('密钥',512)));

解密查询:

1
2
3
select AES_DECRYPT('字段1', UNHEX(SHA2('密钥',512))),
AES_DECRYPT('字段2', UNHEX(SHA2('密钥',512)))
from '表名';

如果你是使用工具,一般上面的方式就能看到人类能读懂的数据,但如果你使用的是命令行工具,那可能需要做一下转化:

1
2
3
select CAST(AES_DECRYPT('字段1', UNHEX(SHA2('密钥',512))) AS CHAR(50)),
CAST(AES_DECRYPT('字段2', UNHEX(SHA2('密钥',512))) AS CHAR(50))
from '表名';

注意:

1.AES加密数据不能使用varchar类型存储,会报[HY000][1366] Incorrect string value: '\x89P\xD76\xC6$...' for column的错误,可以换成varbinary类型。

2.如果表内本身存在数据也需要加密,那可以把字段类型先更换为varbinary,再使用update命令对数据进行加密更新