一 什么是数据脱敏
数据脱敏(Data Masking),顾名思义,是屏蔽敏感数据,对某些敏感信息(比如,身份证号、手机号、卡号、客户姓名、客户地址、邮箱地址、薪资等等 )通过脱敏规则进行数据的变形,实现隐私数据的可靠保护。业界常见的脱敏规则有,替换、重排、加密、截断、掩码,用户也可以根据期望的脱敏算法自定义脱敏规则。
二 姓名脱敏小案例
-
2.1 定长脱敏
所谓定长脱敏,就是替换的’*'的长度固定,效果如下图所示
SELECT
CONCAT( LEFT ( real_name, 1 ), '*', RIGHT ( real_name, CHAR_LENGTH( real_name )- 2 ) ) AS username
FROM
sys_user;
<?php
/**
* Notes:信息脱敏函数
*
* @param $string 字符串
* @param int $start 开始明文长度
* @param int $end 结束明文长度
* @param string $re 替换字符
* @return string
*/
function desensitize($string, $start = 0, $end = 0, $re = '*')
{
if (empty($string) || empty($end) || empty($re)) {
return $string;
}
$strLen = strlen($string);
if ($strLen < ($start + $end)) {
return $string;
}
$strEnd = $strLen - $end;
for ($i = 0; $i < $strLen; $i++) {
if ($i >= $start && $i < $strEnd) {
$str_arr[] = $re;
} else {
$str_arr[] = mb_substr($string, $i, 1);
}
}
return implode('', $str_arr);
}
$name = '王刚';
$mobile = '13817558198';
$name = desensitize($name, 1, 1);
$mobile = desensitize($mobile, 3, 4);
var_dump($name);
var_dump($mobile);
-
2.2 非定长脱敏
所谓非定长脱敏,就是替换的’*'长度不定,要根据姓名实时变化;
方式一
SELECT
rpad(
substring(u.real_name, 1, 1),
char_length(u.real_name),
'*'
)
FROM
sys_user u;
方式二
SELECT
CONCAT( LEFT ( real_name, 1 ), repeat('*',CHAR_LENGTH( real_name )- 1)) AS username
FROM
sys_user;
Java手机号码脱敏
public class PhoneMasking {
public static String maskPhoneNumber(String phoneNumber) {
if (phoneNumber == null || phoneNumber.length() <8) {
throw new IllegalArgumentException("号码长度不够,不支持脱敏");
}
// 截取前三位和后四位
String prefix = phoneNumber.substring(0, 3);
String suffix = phoneNumber.substring(phoneNumber.length() - 4);
// 中间部分用星号替代
StringBuilder maskedPart = new StringBuilder();
for (int i = 0; i < phoneNumber.length() - 7; i++) {
maskedPart.append("*");
}
// 拼接脱敏后的手机号码
return prefix + maskedPart.toString() + suffix;
}
public static void main(String[] args) {
String phoneNumber = "13812345678";
String maskedNumber = maskPhoneNumber(phoneNumber);
System.out.println("Masked phone number: " + maskedNumber);
}
}