44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
"""数据脱敏纯函数(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:]
|