"""数据脱敏纯函数(DESENS-001~004 · docs/PRD/附-风控规则表.md §4)。 原则:API 出参 / 预警 payload / LLM 上下文传入前必须已脱敏; customer_id 为系统内部代理键,不脱敏(DESENS 规则明确); DESENS-005(资产金额展示)归前端组件,后端不实现。 """ from __future__ import annotations def mask_id_card(value: str | None) -> str: """DESENS-001 身份证号:保留前 3 后 4,中间 ****。""" return _mask_middle(value, head=3, tail=4) def mask_phone(value: str | None) -> str: """DESENS-002 手机号:保留前 3 后 4,中间 ****。""" return _mask_middle(value, head=3, tail=4) def mask_name(value: str | None) -> str: """DESENS-003 姓名:保留姓氏,其余 **。""" if not value: return "" return value[0] + "**" def mask_bank_card(value: str | None) -> str: """DESENS-004 银行卡号:保留后 4 位,其余 ****。""" if not value: return "" if len(value) <= 4: return "*" * len(value) return "*" * (len(value) - 4) + value[-4:] def _mask_middle(value: str | None, head: int, tail: int) -> str: """通用中段掩码;长度不足 head+tail 时整体掩码(宁多勿漏)。""" if not value: return "" if len(value) <= head + tail: return "*" * len(value) return value[:head] + "****" + value[-tail:]