第3章:持卡人数据(CHD)保护基础概念

3.1 先搞清楚什么是CHD

聊令牌化之前,咱得先弄明白——到底哪些数据算「持卡人数据」?我见过不少团队一上来就谈令牌,结果发现连自己手里存了哪些敏感字段都没盘点清楚。说白了,PCI DSS 里定义的 CHD(Cardholder Data)就两大部分:卡主身份信息和敏感认证数据。

卡主身份信息包括:

  • 主账号(PAN)——这是最核心的,几乎所有保护措施都围着它转
  • 持卡人姓名
  • 有效期
  • 服务代码

而敏感认证数据(SAD)则是另一码事,包括磁条数据、芯片数据、CVV2/CVC2、PIN 和 PIN 块。这些数据 支付后不能存——这是红线。

核心要点:PAN 是 CHD 的「身份证」,令牌化主要就是为了替换它。SAD 则是一锤子买卖,交易完必须立刻扔掉。

3.2 敏感认证数据(SAD)——碰都不要碰

我记得有一次做审计,发现一家商户把 CVV2 和过期时间一起存到了日志表里。负责的工程师说「为了方便退款时验证」,我听完后背都凉了。PCI DSS 第 3.2 条写得清清楚楚:交易授权完成后,存储 CVV2/CVC2、磁条磁道数据、芯片加密密钥等 SAD 是严格禁止的。

数据类别 能否存储 说明
PAN 可以(需加密/令牌化) 存储后必须做保护处理
持卡人姓名 可以 一般与 PAN 一起保护
有效期 可以 注意不要和 SAD 混存
服务代码 可以 类似有效期处理
CVV2/CVC2 禁止 授权后必须立即删除
磁条磁道数据 禁止 全磁道数据不能留存
PIN/PIN 块 禁止 仅限硬件安全模块内使用

避坑提醒:「我只是临时存了一下」——这个借口在审计时没用。我曾经踩过类似的坑,测试环境里顺手把 CVV 写进了缓存,结果 QSA 直接给了个不符合项。生产环境、测试环境、备份,任何地方都不能存 SAD。

3.3 CHD 的存储限制与要求

就算允许存储 PAN,也不是随便想存多久存多久。PCI DSS 要求你有明确的 数据留存策略:

  • 只保留业务和法律必要的数据
  • 定期清理过期数据(比如退款周期结束后就删除)
  • 定义删除流程并严格执行

你想想看,如果一家商户把所有历史交易的 PAN 都保留 10 年,那被入侵后的损失有多大?我参与过一个项目,他们默认保留了 7 年数据,但实际业务只需要 18 个月。清掉后不仅存储成本降了 60%,审计范围也缩小了一大截。

3.4 保护 CHD 的基本手段

PCI DSS 要求对存储的 CHD 做保护处理。常见的手段有三种:

  1. 加密(Encryption)——用强算法(如 AES-256)把 PAN 变成密文,密钥单独管理。适合数据库字段级加密。
  2. 截断(Truncation)——只保留 PAN 的前六位和后四位,中间用掩码代替。这个方法在显示场景最常用,但注意截断后的数据不能还原完整的 PAN。
  3. 令牌化(Tokenization)——用随机生成的令牌替代 PAN,令牌本身不包含敏感信息。这是咱们课程的核心,后面会细讲。

我的个人建议:如果业务需要频繁使用完整 PAN(比如循环扣款),加密可能比令牌化更合适。但如果主要是收单支付、不需要回查原始 PAN,令牌化是更干净的做法——令牌一旦泄露,攻击者啥也干不了。

3.5 存储范围最小化——能少存就少存

PCI DSS 第 3.1 条的核心思想是「数据最小化」。说白了,如果你不需要存 PAN,就别存。很多场景其实可以用令牌代替——比如订阅支付,根本不需要保留完整的 PAN。

我见过一个常见错误:商户把 PAN、姓名、有效期、甚至账单地址全部存储在同一张表里,却只对 PAN 做了加密。结果一次 SQL 注入,攻击者拿到了所有字段。虽然 PAN 加密了,但姓名和地址是明文,配合外部数据很容易做关联分析。正确的做法是:

  • 能不存的数据就不存(比如账单地址只在交易时用一次)
  • 必须存的字段尽量分开存放,降低单点暴露风险
  • 针对 PAN 做单独的访问控制和加密策略

3.6 CHD 保护的整体框架

为了帮你更好地理解上述概念的关系,我画了一张结构图:

持卡人数据(CHD)保护体系 持卡人数据(CHD) 卡主身份信息 敏感认证数据(SAD) PAN 姓名 有效期 CVV2 磁条 PIN 保护要求 • PAN:可以存储,但必须加密或令牌化,并遵循数据留存策略 • SAD:交易授权完成后禁止存储,必须立即删除 • 存储范围最小化:不要存储非必要 CHD,采用截断或令牌化降低风险

3.7 实践中的常见误区

聊几个我遇到过的真实问题,你以后大概率也会碰上:

  • 误区一:以为令牌化后就万事大吉——令牌本身不是 CHD,但如果你把令牌和原始 PAN 的映射表放在同一个不安全的地方,那令牌化就没意义了。映射表必须受到和 PAN 同等级别的保护。
  • 误区二:在日志里记录完整 PAN——调试日志、错误日志、访问日志里都可能出现请求参数。我有个项目就是因为开发把请求体明文打日志,导致 PAN 泄露。解决方法:用掩码过滤器或直接写日志前做截断。
  • 误区三:混淆截断与令牌化——截断后的 PAN 仍然包含原始信息的前六位和后四位,不能算完全脱敏。某些场景下攻击者可以通过 BIN 库推测身份。令牌化则完全随机,不可逆。

一个小技巧:在数据库设计阶段,就把 CHD 字段单独放到一张安全表,用外键关联。这样审计时能快速定位敏感数据范围,也方便将来迁移到令牌化方案。

3.8 总结一下本章核心点

CHD 保护是 PCI DSS 合规的基石。你需要记住几件事:

  • 分清哪些数据能存(PAN、姓名、有效期),哪些不能存(CVV2、磁条、PIN)
  • 存储的 PAN 必须加密、令牌化或截断
  • 数据留存要设定期限,到期清理
  • 令牌化不是万能药,映射表安全同样重要

这些概念搞清楚了,后面聊令牌化的具体方案、部署架构、合规审计,你才会有扎实的基础。嗯,第三章就到这。