应安全部门要求,数据库敏感信息需加密存储

使用 MySQL 提供的 AES_ENCRYPTAES_DECRYPT 进行了加解密

使用方式如下:

1
2
3
4
5
6
7
8
# 插入
insert into user_info (`user_name`) values (AES_ENCRYPT(`张三`,'key'));

# 更新
update user_info set user_name = AES_ENCRYPT(`张三`,'key') where id = 1;

# 查询
select AES_DECRYPT(user_name, 'key') from user_info where id = 1;

需要注意的地方

  • 密文列的编码方式应选择 latin1,排序方式使用 latin1_german1_ci

  • 查询出现中文乱码时,可以使用 CONVERT (AES_DECRYPT(value, key) USING utf8) 处理

    1
    select CONVERT (AES_DECRYPT(user_name, 'key'USING utf8) as user_name from user_info where id = 1
  • 当密文列的字段类型为 varchar 需要使用 HEX() 函数进行转换,且要注意长度,如果长度依旧不够,可使用 text 类型存储

    1
    2
    3
    4
    5
    # 更新
    update user_info set user_name = HEX(AES_ENCRYPT(`张三`,'key')) where id = 1;

    # 查询
    select AES_DECRYPT(UNHEX(CAST(user_name AS CHAR(32000) CHARACTER SET utf8mb4)), 'key') from user_info where id = 1;
  • 当密文列字段类型为 text 时,select 查询遇到问题可使用 CAST(user_name AS CHAR(20000) CHARACTER SET utf8mb4 来转换类型

    1
    select AES_DECRYPT(CAST(user_name AS CHAR(32000) CHARACTER SET utf8mb4), 'key') from user_info where id = 1;