一、数据脱敏解释
在日常开发需求中会经常遇到数据脱敏处理,比如身份证号、手机号,需要使用*进行部分替换显示。这样能使敏感隐私信息在一定程度上得到保护。那么什么是数据脱敏呢?
在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。
二、数据脱敏实现
数据脱敏实现可以从数据库查数据的时候进行处理,可以在查出数据后进行处理。在这里记录了MySQL数据库查询时处理,通过使用mysql字符串函数实现。
三、实现
首先执行SQL语句:
- 1
MySQL数据脱敏实现
1. CONCAT()、LEFT()和RIGHT()字符串函数组合使用
- CONCAT(str1,str2,…):返回结果为连接参数产生的字符串
- LEFT(str,len):返回从字符串str 开始的len 最左字符
RIGHT(str,len):从字符串str 开始,返回最右len 字符
执行SQL语句:
SELECT
CONCAT(LEFT(IdentityCardNo,3), '****' ,RIGHT(IdentityCardNo,4)) AS 身份证号
FROM c_inhabitantinfo;
- 1
- 2
- 3
2.INSERT()
INSERT(str,pos,len,newstr):返回字符串 str, 其子字符串起始于 pos 位置和长期被字符串 newstr取代的len 字符
执行SQL语句:
SELECT INSERT(IdentityCardNo, 4, 11, '****') AS 身份证号 FROM c_inhabitantinfo;
四、脚本方法
DELIMITER $$
CREATE FUNCTION `f_get_rand_number`(p_size int) RETURNS int(20)
COMMENT '取参数传入长度的随机数'
BEGIN
-- select f_get_rand_number(4) ; -- 1699
DECLARE v_rand_number int(20);
DECLARE v_multiplier int;
if p_size>20 then
set p_size = 20;
end if;
set v_multiplier=RPAD('1',p_size,'0');
SELECT ROUND(RAND() * v_multiplier + v_multiplier) INTO v_rand_number;
RETURN v_rand_number;
END
DELIMITER;DELIMITER
CREATE FUNCTION `f_padding_str`(p_original varchar(200),p_index int ,p_padding_str varchar(1)) RETURNS varchar(200) CHARSET utf8
COMMENT '数据脱敏 将p_original从p_index位后替换成p_padding_str'
BEGIN
-- select f_padding_str('良好压顶奇才',4,'某'); -- 良好压顶某某
declare v_rtn_str varchar(200);
declare v_len int;
if p_original is null then
return '';
end if;
if char_length(p_original)>200 then
set p_original = substring(p_original,1,200);
end if;
set v_len = char_length(p_original);
set v_rtn_str = RPAD(substring(p_original,1,p_index),v_len,p_padding_str);
RETURN v_rtn_str;
END
DELIMITER;DELIMITER
CREATE FUNCTION `f_replace_str`(p_original varchar(200),p_index int ,p_size int,p_replace_str varchar(100)) RETURNS varchar(200) CHARSET utf8
COMMENT '数据脱敏 将p_original从p_index位后p_size长度的字符串替换成p_replace_str'
BEGIN
-- select f_replace_str('12345678',2,3,'bbb'); -- 1bbb5678
-- select f_replace_str('12345678',2,0,'bbb'); -- 1bbb
-- select f_replace_str('12345678',-2,0,'bbb');-- 123456bbb
declare v_rtn_str varchar(200);
declare v_sub_str varchar(100);
if p_original is null then
return '';
end if;
if char_length(p_original)>200 then
set p_original = substring(p_original,1,200);
end if;
-- 当p_size为0时,则将p_index后所有字符替换为p_replace_str
if p_size =0 then
set v_sub_str = substring(p_original,p_index);
else
set v_sub_str = substring(p_original,p_index,p_size);
end if;
set v_rtn_str = replace(p_original,v_sub_str,p_replace_str);
RETURN v_rtn_str;
END$$
DELIMITER ;
五、第三方产品DBMasker