数据库字段加解密处理

解决场景:
需要对应用数据存储时采取加密,比如手机号码、地址、证件号

方案:




其中:
        加解密函数存储在数据库中定义;
        加解密使用的key在应用中定义(定义后不可改变);


示例:
  测试用表:

1
2
3
4
5
CREATE TABLE `sys_user` (
`user_id` BIGINT (20) NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR (128) DEFAULT NULL,
`user_mobile` VARCHAR (128) DEFAULT NULL,
PRIMARY KEY (`user_id`)) ENGINE = INNODB DEFAULT CHARSET = utf8

插入:

1
2
3
4
5
INSERT INTO `sys_user` (`user_name`, `user_mobile`) VALUES
(
'smartfoot',
DATA_ENCRYPT ('13888888888', 'KEY_ABC')
);

存储结果:

查询:

1
2
3
4
5
SELECT
`user_id`,
`user_name`,
DATA_DECRYPT (`user_mobile`, 'KEY_ABC') user_mobile
FROM `sys_user`;

查询结果:

模糊匹配:

1
2
3
4
5
6
SELECT
`user_id`,
`user_name`,
HG_DECRYPT (`user_mobile`, 'KEY_ABC') user_mobile
FROM `sys_user`
WHERE HG_DECRYPT (`user_mobile`, 'KEY_ABC') LIKE '138%';

查询结果:

注意事项
        加解密函数:加解密函数存储在数据库中定义,与应用无关;
        key :加解密使用的key在应用中定义(定义后不可改变);
        由于加密后的长度可变,适当增加加密字段定义长度;


Mysql:
加密函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DELIMITER $$

DROP FUNCTION
IF EXISTS `DATA_ENCRYPT`$$

CREATE DEFINER = CURRENT_USER FUNCTION `DATA_ENCRYPT` (
p_text VARCHAR (255),
p_key VARCHAR (255)
) RETURNS VARCHAR (255) CHARSET utf8
BEGIN

IF (CHAR_LENGTH(p_text) = 0) THEN
RETURN '' ;
ELSEIF CHAR_LENGTH(p_key) = 0 THEN
RETURN p_text ;
ELSE
RETURN HEX(AES_ENCRYPT(p_text, p_key)) ;
END
IF ; END$$
DELIMITER ;

解密函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DELIMITER $$
DROP FUNCTION
IF EXISTS `DATA_DECRYPT`$$

CREATE DEFINER = CURRENT_USER FUNCTION `DATA_DECRYPT` (
p_text VARCHAR (255),
p_key VARCHAR (255)
) RETURNS VARCHAR (255) CHARSET utf8
BEGIN

IF (CHAR_LENGTH(p_text) = 0) THEN
RETURN '' ;
ELSEIF CHAR_LENGTH(p_key) = 0 THEN
RETURN p_text ;
ELSE
RETURN AES_DECRYPT(UNHEX(p_text), p_key) ;
END
IF ; END$$
DELIMITER ;

本文结束啦感谢您的阅读

本文标题:数据库字段加解密处理

文章作者:Smartfoot

原始链接:http://blog.bestsmartfoot.top/2018/06/05/数据库字段加解密处理/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

公众号