第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 做保护处理。常见的手段有三种:
- 加密(Encryption)——用强算法(如 AES-256)把 PAN 变成密文,密钥单独管理。适合数据库字段级加密。
- 截断(Truncation)——只保留 PAN 的前六位和后四位,中间用掩码代替。这个方法在显示场景最常用,但注意截断后的数据不能还原完整的 PAN。
- 令牌化(Tokenization)——用随机生成的令牌替代 PAN,令牌本身不包含敏感信息。这是咱们课程的核心,后面会细讲。
我的个人建议:如果业务需要频繁使用完整 PAN(比如循环扣款),加密可能比令牌化更合适。但如果主要是收单支付、不需要回查原始 PAN,令牌化是更干净的做法——令牌一旦泄露,攻击者啥也干不了。
3.5 存储范围最小化——能少存就少存
PCI DSS 第 3.1 条的核心思想是「数据最小化」。说白了,如果你不需要存 PAN,就别存。很多场景其实可以用令牌代替——比如订阅支付,根本不需要保留完整的 PAN。
我见过一个常见错误:商户把 PAN、姓名、有效期、甚至账单地址全部存储在同一张表里,却只对 PAN 做了加密。结果一次 SQL 注入,攻击者拿到了所有字段。虽然 PAN 加密了,但姓名和地址是明文,配合外部数据很容易做关联分析。正确的做法是:
- 能不存的数据就不存(比如账单地址只在交易时用一次)
- 必须存的字段尽量分开存放,降低单点暴露风险
- 针对 PAN 做单独的访问控制和加密策略
3.6 CHD 保护的整体框架
为了帮你更好地理解上述概念的关系,我画了一张结构图:
3.7 实践中的常见误区
聊几个我遇到过的真实问题,你以后大概率也会碰上:
- 误区一:以为令牌化后就万事大吉——令牌本身不是 CHD,但如果你把令牌和原始 PAN 的映射表放在同一个不安全的地方,那令牌化就没意义了。映射表必须受到和 PAN 同等级别的保护。
- 误区二:在日志里记录完整 PAN——调试日志、错误日志、访问日志里都可能出现请求参数。我有个项目就是因为开发把请求体明文打日志,导致 PAN 泄露。解决方法:用掩码过滤器或直接写日志前做截断。
- 误区三:混淆截断与令牌化——截断后的 PAN 仍然包含原始信息的前六位和后四位,不能算完全脱敏。某些场景下攻击者可以通过 BIN 库推测身份。令牌化则完全随机,不可逆。
一个小技巧:在数据库设计阶段,就把 CHD 字段单独放到一张安全表,用外键关联。这样审计时能快速定位敏感数据范围,也方便将来迁移到令牌化方案。
3.8 总结一下本章核心点
CHD 保护是 PCI DSS 合规的基石。你需要记住几件事:
- 分清哪些数据能存(PAN、姓名、有效期),哪些不能存(CVV2、磁条、PIN)
- 存储的 PAN 必须加密、令牌化或截断
- 数据留存要设定期限,到期清理
- 令牌化不是万能药,映射表安全同样重要
这些概念搞清楚了,后面聊令牌化的具体方案、部署架构、合规审计,你才会有扎实的基础。嗯,第三章就到这。