js实现脱敏
实现脱敏的常见方法
使用正则表达式替换敏感信息 正则表达式可以快速匹配特定模式的字符串并进行替换。例如隐藏手机号中间四位:
const phone = '13812345678';
const desensitizedPhone = phone.replace(/(\d{3})\d{4}(\d{4})/, '$1$2');
// 输出: 1385678
处理身份证号 身份证号通常保留前6位和后4位,中间用星号代替:
const idCard = '110105199003072345';
const desensitizedId = idCard.replace(/(\d{6})\d{8}(\d{4})/, '$1$2');
// 输出: 1101052345
处理银行卡号 银行卡号一般显示前6位和后4位:

const bankCard = '6225880123456789';
const desensitizedCard = bankCard.replace(/(\d{6})\d{6}(\d{4})/, '$1$2');
// 输出: 6225886789
处理姓名 中文姓名通常保留姓氏,名字用星号代替:
const name = '张三';
const desensitizedName = name.replace(/([\u4e00-\u9fa5])[\u4e00-\u9fa5]/, '$1*');
// 输出: 张*
处理邮箱地址 邮箱可保留@符号前的第一个字符和最后一个字符:

const email = 'example@domain.com';
const desensitizedEmail = email.replace(/(.).*@(.*)/, '$1*@$2');
// 输出: e*@domain.com
封装通用脱敏函数
可以创建一个通用函数处理多种脱敏场景:
function desensitize(str, type) {
switch(type) {
case 'phone':
return str.replace(/(\d{3})\d{4}(\d{4})/, '$1$2');
case 'idCard':
return str.replace(/(\d{6})\d{8}(\d{4})/, '$1$2');
case 'bankCard':
return str.replace(/(\d{6})\d{6}(\d{4})/, '$1$2');
case 'name':
return str.replace(/([\u4e00-\u9fa5])[\u4e00-\u9fa5]/, '$1*');
case 'email':
return str.replace(/(.).*@(.*)/, '$1*@$2');
default:
return str;
}
}
注意事项
脱敏处理应考虑业务需求,不同场景可能需要不同的脱敏规则。敏感信息处理应遵循最小化原则,在满足业务需求的前提下尽可能减少敏感信息的暴露。
对于更复杂的需求,可以考虑使用第三方库如lodash的掩码功能,或者专门的数据脱敏库。在生产环境中,建议将脱敏逻辑放在服务端处理,避免在前端暴露原始数据。






