OpenMed 尼日利亚 NDPA 2023 去标识化清单:`ng_ndpa` 严格 Profile 的技术实现与落地指南

发布时间:2026/9/18 13:44:44
OpenMed 尼日利亚 NDPA 2023 去标识化清单:`ng_ndpa` 严格 Profile 的技术实现与落地指南
OpenMed 尼日利亚 NDPA 2023 去标识化清单ng_ndpa严格 Profile 的技术实现与落地指南【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed本文仅为技术决策支持不构成法律意见。本文描述 OpenMed 开源项目中ng_ndpa去标识化 Profile 的技术默认行为不评判处理行为的合法性不确立第 30 条section 30的合法处理依据不认证对《尼日利亚数据保护法 2023》Nigeria Data Protection Act 2023NDPA的合规性也不能替代尼日利亚法律顾问或数据保护官DPO的意见。导读尼日利亚于 2023 年通过《数据保护法》NDPA 2023其第 65 条释义条款与第 30 条对敏感个人数据的处理施加了严格限制第 4142 条则对跨境数据传输提出了充分性评估要求。本文以 OpenMed 仓库中的 docs/compliance/ng-ndpa-identifier-checklist.md 为核心骨架结合 openmed/core/policies/ng_ndpa.json、openmed/core/labels.py 等源码与测试系统讲解ng_ndpaProfile 的敏感数据类型映射、标识符处理策略、本地优先local-first处理对跨境传输问题的影响以及其背后的统一策略引擎实现。读完本文你将能够理解 NDPA 第 30 条敏感数据分类如何锚定到 OpenMed 的规范标签体系掌握ng_ndpa的不可逆去标识化姿态及其replace/mask动作分配并能在自己的数据集上验证该 Profile 的覆盖行为。一、ng_ndpaProfile 的定位严格且不可逆的去标识化姿态ng_ndpa是 OpenMed 内置的一个严格、不可逆的去标识化 Profile。文档 ng-ndpa-identifier-checklist.md 明确给出了它的三个技术承诺强制安全扫描safety sweep处理管线必须执行确定性结构化标识符扫描不允许跳过不保留替换映射no replacement mappingkeep_mapping为false即生成的结果不可逆不会留存原始值到合成值的对照表每个规范标签都分配非keep动作所有CANONICAL_LABELS中的标签都被指定为replace或mask不存在默认保留keep的类别。这些承诺在策略文件中被固化。查看 openmed/core/policies/ng_ndpa.json 可以看到关键字段{ schema_version: 1, name: ng_ndpa, posture: ng_ndpa_deidentification, threshold_profile: strict_no_leak, default_action: replace, default_action_bias: replace_sensitive_personal_data, arbitration_mode: high_recall_union, strict_no_leak: true, safety_sweep_mandatory: true, keep_mapping: false, reversible_id: false, forced_cascade_tiers: [R0, R1, R2, R3], policy_label_actions: { DIRECT_IDENTIFIER: replace, QUASI_IDENTIFIER: mask, CLINICAL_CONCEPT: mask } }这些字段的语义可以在策略加载与编译实现 openmed/core/policy.py 中得到印证arbitration_mode必须是预定义的仲裁模式之一high_recall_union即高召回并集多个识别器的标签取并集宁可多处理也不错放strict_no_leak默认值为false但ng_ndpa显式置为truesafety_sweep_mandatory控制安全扫描是否为强制项ng_ndpa为truekeep_mapping控制是否保留映射以支持可逆操作ng_ndpa为false与不可逆去标识化承诺一致forced_cascade_tiers指定必须级联处理的层级R0R3。法律边界说明NDPA 第 65 条释义条款将敏感个人数据界定为包括用于唯一识别自然人的基因与生物特征数据、种族或民族出身、宗教或类似信仰含良知与哲学、健康状况、性生活、政治观点或政治派别、工会会员身份以及委员会Nigeria Data Protection CommissionNDPC依第 30(2) 条进一步规定的其他信息。第 30(1) 条限制处理敏感个人数据除非满足其列明的某一项合法依据。本文档描述的映射是保守的技术锚点并非认定每个标签的每次出现都构成 NDPA 下的敏感个人数据。二、第 30 条敏感数据类型参考表Section 30 sensitive-data category reference下表是ng_ndpaProfile 将 NDPA 第 30/65 条敏感数据类别映射到 OpenMed 规范标签CANONICAL_LABELS的完整清单。其中replace表示在该 Profile 下进行不可逆合成替换mask表示替换为类型化占位符二者均属于非keep动作。NDPA 类别键法条类别规范标签锚点Profile 动作GENETIC_AND_BIOMETRIC_DATA第 65 条与第 30 条用于唯一识别自然人的基因与生物特征数据ID_NUM,EYE_COLOR,HEIGHT,GENE_SYMBOL,VARIANT_DESCRIPTOR,PROTEIN_CHANGE,ZYGOSITY,CLINICAL_SIGNIFICANCEmaskRACE_OR_ETHNIC_ORIGIN第 65 条与第 30 条种族或民族出身ETHNICITY,OTHERmaskRELIGIOUS_OR_SIMILAR_BELIEFS第 65 条与第 30 条宗教或类似信仰包括良知或哲学OTHERmaskHEALTH_STATUS第 65 条与第 30 条健康状况本 Profile 下含健康档案标识符与临床内容ID_NUM,MICROORGANISM,ANTIBIOTIC,SUSCEPTIBILITY,CONDITION,MEDICATION,LAB_TEST,PROCEDURE,BODY_SITE,DEVICE,PROBLEM,SEVERITY,DOSAGE,ROUTE,FREQUENCY,DURATION,FORM,STRENGTH,INDICATION,LAB_VALUE,UNIT,REFERENCE_RANGE,ABNORMAL_FLAG,ANESTHESIA_TYPE,ANESTHETIC_AGENT,AIRWAY_MANAGEMENT,ASA_CLASS,DIET_TYPE,NUTRITION_TARGET,FEEDING_ROUTE,NUTRITIONAL_STATUS,VACCINE_NAME,DOSE_NUMBER,ADMINISTRATION_ROUTE,VACCINE_LOT,VACCINE_SERIES,INTAKE_OUTPUT,LINE_DRAIN_TUBE,NURSING_RISK_SCORE,CARE_INTERVENTION,GENE_SYMBOL,VARIANT_DESCRIPTOR,PROTEIN_CHANGE,ZYGOSITY,CLINICAL_SIGNIFICANCE,GLYCEMIC_MEASURE,THYROID_MEASURE,HORMONE_LEVEL,INSULIN_REGIMEN,ENDOSCOPIC_FINDING,GI_SYMPTOM,GI_SCORE,POLYP_DESCRIPTOR,CKD_STAGE,DIALYSIS_MODALITY,RENAL_FUNCTION_MEASURE,URINE_FINDING,SPIROMETRY_MEASURE,OXYGEN_SUPPORT,RESPIRATORY_FINDING,DYSPNEA_GRADE,GROWTH_PARAMETER,GROWTH_PERCENTILE,DEVELOPMENTAL_MILESTONEmaskSEX_LIFE第 65 条与第 30 条性生活GENDER,OTHERmaskPOLITICAL_OPINIONS_OR_AFFILIATIONS第 65 条与第 30 条政治观点或政治派别ORGANIZATION,OTHERmaskTRADE_UNION_MEMBERSHIPS第 65 条与第 30 条工会会员身份ORGANIZATION,JOB_DEPARTMENT,OTHERmaskOTHER_COMMISSION_PRESCRIBED_DATA第 30(2) 条与第 65 条委员会规定的其他敏感个人数据OTHERmask上表中出现的全部标签都收录于规范标签全集CANONICAL_LABELS见 openmed/core/labels.py。源码中这份映射以NDPA_SENSITIVE_CLASS_LABELS: Mapping[str, FrozenSet[str]]的形式正式落地openmed/core/labels.py并且NDPA_SENSITIVE_DATA_CLASSES冻结集合列出了全部 8 个 NDPA 敏感数据类别键NDPA_SENSITIVE_CLASS_LABELS是多对多法定交叉映射many-to-many statutory cross-map因为OTHER这类宽泛回退标签可能同时锚定多个类别数据类别键如NDPA_HEALTH_STATUS、NDPA_RACE_OR_ETHNIC_ORIGIN也被定义为常量供测试与文档一致性校验引用。2.1 边界说明与回退语义ETHNICITY表示明确上下文化的种族或民族归属检测结果OTHER则是没有专属规范标签的敏感属性的保守回退。Profile 动作保护的是正确归一化后的检测结果它本身不会发现信仰、性生活、政治或工会相关词汇。站点应当使用合成数据或其他经批准的本地区域数据验证检测器覆盖度并在必要时添加经批准的自定义识别器custom recognizers。EYE_COLOR与HEIGHT仅被视为生物特征提示biometric hints上表并不主张它们在所有上下文中都属于生物特征数据。从非洲统一基准docs/compliance/africa-malabo-baseline.md的覆盖矩阵看ng_ndpa与africa_malabo_baseline、eg_pdpl、ke_dpa、ma_law_09_08、za_popia同属初始非洲 Profile 集见 tests/unit/core/test_africa_policy_coverage.py 中的_INITIAL_AFRICAN_PROFILES且 tests/unit/core/fixtures/africa_statute_coverage.json 中为ng_ndpa的每个法定类别都登记了引用条款sections 30 and 65与规范标签清单。该测试文件的核心断言是每个声明类别中的所有标签在编译后的策略中都必须是非keep覆盖test_declared_statute_class_has_compiled_non_keep_coverage。三、关联标识符控制Linked identifier controls仅处理敏感临床内容还不够——严格 Profile 同时会移除那些能把敏感临床内容与具体个人关联起来的标识符。下表列出ng_ndpa对关联标识符的处理技术标识符类别规范标签Profile 动作姓名与用户句柄PERSON,FIRST_NAME,LAST_NAME,MIDDLE_NAME,PREFIX,USERNAMEreplace联系方式EMAIL,PHONE,URLreplace拉各斯、阿布贾及其他地点信息LOCATION,STREET_ADDRESS,BUILDING_NUMBER,ZIPCODE,GPS_COORDINATES,ORDINAL_DIRECTIONmask日期与人口统计准标识符DATE,DATE_OF_BIRTH,TIME,AGE,GENDER,EYE_COLOR,HEIGHTmaskNIN 式国民 ID、健康档案 ID 与生物特征模板 IDID_NUM,SSNmaskBVN 式及其他账户或金融标识符ACCOUNT_NUMBER,CREDIT_CARD,CVV,IBAN,BIC,BITCOIN_ADDRESS,ETHEREUM_ADDRESS,LITECOIN_ADDRESS,MASKED_NUMBERmask认证、网络、设备与车辆标识符PASSWORD,PIN,API_KEY,IP_ADDRESS,MAC_ADDRESS,USER_AGENT,VIN,VEHICLE_REGISTRATION,IMEImask免责说明NIN 式与 BVN 式数值只是本表中的技术示例其纳入是一种保守的去标识化默认行为并非主张 NDPA 将每一个 NIN 或 BVN 都明确界定为敏感个人数据。在策略文件层面这些动作与直接标识符 →replace、准标识符 →mask的分层策略标签动作是一致的姓名、联系方式属于DIRECT_IDENTIFIER高风险、replace而日期、年龄、地点等属于QUASI_IDENTIFIER中风险、mask。从 openmed/core/labels.py 的LABEL_METADATA可以看到每个标签的风险分级与系统提示如PHONE为 DIRECT_IDENTIFIER/highLOCATION为 QUASI_IDENTIFIER/medium。这解释了为什么表格中两者动作不同replace用不可逆合成值替换高风险直接标识符mask用类型化占位符保护准标识符与临床概念。四、第 4142 条与本地优先处理local-first processingNDPA 第 41 条限制将个人数据从尼日利亚向另一国传输除非接收方具备充分的保护机制adequacy或满足第 43 条条件该条还要求记录传输依据与第 42 条充分性评估。第 42 条则描述了充分性及其评估因素。ng_ndpa的本地优先特性对此具有直接意义当 OpenMed完全运行在用户设备上且既未将输入文本、也未将去标识化后的输出发送给另一国的接收方时去标识化操作本身不构成跨境传输因此一个完全本地化的工作流可以避免该操作环节的第 4142 条传输依据与充分性问题但后续的云存储、遥测、支持访问、模型调用、导出或其他披露行为可能构成新的独立传输必须单独评估Profile 本身不评估充分性、第 43 条条件、同意、合同或其他任何合法处理依据。这与 OpenMed 项目的整体定位Local-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device全部在设备端运行、数据不出网保持一致。从部署形态看docs/deploy/self-hosted-compose.md、deploy/openmed-compose.yaml 以及 Android/Apple 的端侧运行示例android/openmedkit、swift/OpenMedKit都体现了数据留在本地网络内的架构取向。五、实现机制统一策略引擎与强制安全扫描5.1 无辖区专用分支ng_ndpa不包含任何辖区专用jurisdiction-specific的引擎分支。它完全复用 OpenMed 的公共策略机制公共策略加载器与编译器openmed/core/policy.py 中的load_policy/compile_policy动作解析器action resolver依据actions字段与policy_label_actions分层动作分配具体处理动作强制安全扫描mandatory safety sweep风险预算机制openmed/risk/budget.py。从 tests/unit/core/test_policy_profiles.py 可以看到专门的验证test_ng_ndpa_profile_loads_with_strict_sensitive_data_defaults确认ng_ndpa能正常加载并出现在list_policies()中且具有严格的敏感数据默认行为test_ng_ndpa_checklist_classes_have_non_keep_canonical_coverage将文档清单行与NDPA_SENSITIVE_DATA_CLASSES/NDPA_SENSITIVE_CLASS_LABELS逐项比对确保文档与源码的映射完全一致set(checklist_rows) set(NDPA_SENSITIVE_DATA_CLASSES)且每个类别的标签集合与源码映射逐一对齐test_ng_ndpa_synthetic_fixtures_leave_zero_direct_identifiers使用合成语料fixtures 目录下的ng_ndpa_synthetic.json跑通deidentify(policyng_ndpa, ...)断言直接标识符零残留审计结果中每个 span 的动作都不是keep。5.2 安全扫描的强制化在 openmed/core/pii.py 中deidentify的use_safety_sweep参数默认True控制确定性结构化标识符扫描。由于ng_ndpa将safety_sweep_mandatory置为true该 Profile 要求管线必须执行安全扫描确保 NIN 式、BVN 式等结构化的编号型标识符即使未被 NER 模型识别也能被确定性规则兜底捕获。审计输出auditTrue时会记录safety_sweep的来源与enabled状态见 tests/unit/core/test_africa_policy_coverage.py 中result.metadata[safety_sweep][source] safety_sweep的断言模式。5.3 上下文术语覆盖非洲语境术语表 openmed/core/data/africa_context_terms.json 中登记了ng_ndpa的覆盖规则SENSITIVE_ATTRIBUTE策略标签动作为mask并显式对ACCOUNT_NUMBER、ETHNICITY、ORGANIZATION强制mask。这保证了在泛非洲/尼日利亚语境下账户号、族裔与组织归属这些高敏属性不会因模型默认动作而被降级处理。配套测试 tests/unit/core/test_africa_context_safety_sweep.py 覆盖了这一行为。六、实施笔记使用ng_ndpa时的三条硬性约束NDPA_SENSITIVE_CLASS_LABELS是多对多法定交叉映射宽泛回退标签如OTHER可以同时锚定多个 NDPA 类别。修改这份映射时必须同步更新 docs/compliance/ng-ndpa-identifier-checklist.md 中的对照表否则 tests/unit/core/test_policy_profiles.py 的文档-源码一致性测试会失败。ng_ndpa无辖区专用引擎分支它完全依赖公共策略加载器、编译器、动作解析器、强制安全扫描与风险预算机制。任何对标签动作的定制都应通过 Profile JSON如 openmed/core/policies/ng_ndpa.json而非引擎分支实现。该 Profile 的所有提交 fixtures 均为合成数据不得用真实患者、NIN、BVN、地址、电话或生物特征数据替换。合成语料示例位于测试 fixturestests/unit/core/fixtures/ng_ndpa_synthetic.json及相关非洲覆盖 fixture tests/unit/core/fixtures/africa_statute_coverage.json。七、配套验证与延伸阅读检测器覆盖验证在合成或经批准的数据上运行确认模型能正确检出族裔、信仰、政治/工会等敏感属性必要时增加自定义识别器custom recognizers后重新跑覆盖测试。零泄漏断言参考 tests/unit/core/test_africa_policy_coverage.py 的泄漏用例模式使用deidentify(..., auditTrue)检查leakage_rate 0.0与所有 span 的action ! keep。关联文档非洲数据保护合规基线见 docs/compliance/africa-malabo-baseline.md肯尼亚 DPA 检查清单见 docs/compliance/ke-dpa-identifier-checklist.md南非 POPIA 检查清单见 docs/compliance/za-popia-identifier-checklist.md。集成场景NDPA Profile 同样可用于 dbt 数据管道去标识见 integrations/dbt/macros/redact.sql 及其文档 docs/integrations/dbt.md 中对非洲 Profile 的引用以及数据库列级去标识化场景。最后再次强调本清单是技术默认行为的描述不是法律意见。NDPA 第 30(1) 条是否适用、第 43 条条件是否满足、充分性评估如何完成均需由具备尼日利亚执业资格的法律顾问结合具体处理场景判断。【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考