解决场景:
需要对应用数据存储时采取加密,比如手机号码、地址、证件号
示例:
测试用表:
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
插入:
INSERT INTO `sys_user` (`user_name`, `user_mobile`) VALUES
(
'smartfoot',
DATA_ENCRYPT ('13888888888', 'KEY_ABC')
);
查询:
SELECT
`user_id`,
`user_name`,
DATA_DECRYPT (`user_mobile`, 'KEY_ABC') user_mobile
FROM `sys_user`;
模糊匹配:
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:
加密函数:
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 ;
解密函数:
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 ;
_key) ;
END
IF ; END$$
DELIMITER ;