功能说明
maskEmail 用于在日志、错误信息和审计记录中降低电子邮件的可识别性。它保留域名,便于排查投递问题,同时把本地部分压缩成首字符、固定三个星号和末字符;一两个字符的短地址采用更保守的规则,避免暴露过多信息。可选的 maskDomain 会把除顶级域外的所有域名标签替换为等长星号,适合域名本身也属于敏感信息的场景。
函数会先做基本格式校验,包括长度、空白字符、唯一的 @、非空本地部分和合理的域名结构。校验失败时抛出错误,调用方可以决定记录原始长度还是跳过该条日志,而不是把未脱敏的地址写出去。
关键代码
本地部分按长度分支处理,域名部分可以选择逐标签遮蔽:
if (local.length === 1) {
maskedLocal = "*";
} else if (local.length === 2) {
maskedLocal = `${local[0]}*`;
} else {
maskedLocal = `${local[0]}***${local[local.length - 1]}`;
}
开启域名遮蔽时,最后一段顶级域保留,其余标签用与标签长度相同的星号替换,因此输出长度仍然稳定。
使用注意
该函数只做展示层脱敏,不适用于需要不可逆匿名化的合规场景;对于很短的本地部分或唯一域名,仍可能被推断出身份。它不解析显示名称形式,例如 Alice <[email protected]> 会因空白被拒绝,调用前应先提取纯地址。国际化域名和带引号的本地部分也没有完整支持。
域名校验只检查点号结构,不验证 DNS 是否真实存在。maskDomain 会把 mail.example.com 变成 ****.*******.com,但顶级域仍然暴露。若地址包含多个 @ 或本地部分为空会抛错。异常信息不包含原始地址,适合直接记录,但仍建议调用方统一捕获。
验证方式
示例分别输出 [email protected]、两字符地址、一字符地址和开启域名遮蔽的结果,观察本地部分只保留首尾字符,短地址按规则减少暴露。最后传入 not-an-email,应捕获并输出 invalid email address。可以再补充大小写、前后空格和连续点号等边界输入,确认校验行为符合预期。