用MySQL自身函数实现 - 随机盐加密,解密,脱敏。

-- 创建user表,包含id、手机号加密字段(mobile)、以及用于加密的随机盐字段(salt)
CREATE TABLE `user` (
    `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `mobile` VARBINARY(255) COMMENT '加密后的手机号',
    `salt` VARCHAR(255) COMMENT '随机盐,用于生成加密密钥',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='用户信息表';


-- 加密插入数据

-- 使用UUID()生成随机盐值,并将其与固定密钥串联生成最终的加密密钥
SET @salt = UUID();
SET @key = CONCAT(@salt, 'MyKey1234567890');
INSERT INTO user(mobile,salt)
VALUES 
(AES_ENCRYPT('13311111111', @key), @salt);

SET @salt = UUID();
SET @key = CONCAT(@salt, 'MyKey1234567890');
INSERT INTO user(mobile,salt)
VALUES 
(AES_ENCRYPT('13599911111', @key), @salt);


-- 解密数据

-- 使用存储的盐值与固定密钥串联来解密手机号
SELECT CONVERT(AES_DECRYPT(mobile, CONCAT(salt,'MyKey1234567890')) USING utf8) AS mobile FROM user;

用MySQL自身函数实现 - 随机盐加密,解密,脱敏。_MySQL

-- 脱敏数据展示

-- 安装脱敏插件
mysql> INSTALL PLUGIN data_masking SONAME 'data_masking.so';
mysql> SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'data%';

-- 保留手机号的前3位和后2位,中间部分用'X'替代
SELECT mask_inner(CONVERT(AES_DECRYPT(mobile, CONCAT(salt,'MyKey1234567890')) USING utf8), 3, 2) AS mobile FROM user;

用MySQL自身函数实现 - 随机盐加密,解密,脱敏。_字段_02