javascript身份证脱敏最稳妥方式是字符串截取加星号替换:15位掩码第7–8位,18位掩码第7–14位(含x前数字),统一转字符串防科学计数法,用[0-9]兼容ie11,末位用[0-9a-z]确保x匹配。

身份证号中间8位怎么用JavaScript脱敏
直接用字符串截取加星号替换最稳妥,别依赖正则捕获组做复杂匹配——容易漏掉15位老格式或忽略末尾X校验码。
常见错误是写成 idCard.replace(/(\d{4})\d{10}(\d{4})/, '$1****$2'),这会把15位号码(无X、少两位)完全跳过,且对18位中带X的末位处理不安全。
- 统一先转为字符串:
String(idCard),避免数字类型被自动转科学计数法(比如超长ID变成1.23e+17) - 区分长度处理:15位掩码第7–8位,18位掩码第7–14位(含X前所有数字)
- 推荐写法:
idCard.replace(/^(\d{6})\d{8}(\w{4})$/, '$1********$2'),\w确保末位X也能匹配
Vue模板里怎么安全显示脱敏后的身份证
不能在{{ }}里写一长串replace逻辑,既难读又无法复用。更不能把脱敏逻辑塞进data或computed里暴露原始号——万一被console.log或调试工具扫到就全暴露了。
正确做法是封装成过滤器或计算属性,且原始字段必须设为data中不可响应式(用Object.defineProperty或markRaw),或者干脆只存脱敏后结果。
- Vue 3组合式API示例:
const maskedId = computed(() => idCard.value?.replace(/^(\d{6})\d{8}(\w{4})$/, '$1********$2') || '') - 若需全局使用,注册自定义指令:
v-mask-id,绑定时自动处理,避免模板重复写逻辑 - 注意:服务端返回的身份证字段名别叫
idCard,改用idCardMasked或idCardHint,从源头降低误用风险
后端返回前就该脱敏,前端不该承担这个责任
前端脱敏只是障眼法,控制台里打个console.log(data.idCard)立刻原形毕露。真正要防的是接口被爬、F12被看、甚至代理抓包。
如果后端没法改,至少加一层“前端沙箱”:用Proxy拦截对象访问,对敏感字段动态返回脱敏值。
- 简单沙箱示例:
new Proxy(rawData, { get: (obj, key) => key === 'idCard' ? obj[key]?.replace(/^(\d{6})\d{8}(\w{4})$/, '$1********$2') : obj[key] }) - 但Proxy无法拦截JSON.stringify——所以仍需后端配合,否则序列化后还是明文
- 关键点:脱敏逻辑必须和原始数据物理隔离,不能共用同一个变量名或属性路径
IE11里replace不支持\d怎么办
IE11的RegExp对\d支持不稳定,尤其遇到Unicode数字(如阿拉伯数字)会失效。直接换[0-9]最保险,别信“加u标志就行”这种说法——IE根本不认u标志。
- 兼容写法:
idCard.replace(/^([0-9]{6})[0-9]{8}([0-9A-Za-z]{4})$/, '$1********$2') - 注意
[0-9A-Za-z]覆盖末位X,但别用[a-z]小写——身份证X必须大写,校验逻辑依赖这点 - 如果项目还跑在IE上,建议把脱敏函数抽成独立模块,用Babel转译+polyfill双重兜底
脱敏不是加几颗星就完事,核心是控制原始数据的生命周期——它在哪一刻诞生、在哪一刻销毁、中间有没有被意外复制或缓存。最容易被忽略的,是localStorage里存了明文ID,或者Vuex state没清空,下次页面进来直接复用。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











