4. 令牌化算法选型
令牌化算法选型不是“哪个算法更安全”的单维问题,而是安全强度、业务可用性、系统改造成本与合规约束之间的多目标权衡。工程上通常把令牌分为四类:随机令牌、格式保留令牌、可逆令牌和不可逆令牌。它们并非互斥,同一系统常在不同字段上混用。选型的核心是先回答三个问题:令牌是否需要还原?是否需要保持原字段格式?是否需要支持范围查询或连接?
四类令牌的本质差异
随机令牌用密码学安全随机数生成,与明文无任何数学关联,例如生成 128 位随机值再 Base64 编码。它安全性最高,但长度和字符集通常与原字段不同,且无法直接还原,除非把“令牌—明文”映射存入受保护的令牌库(Token Vault)。因此随机令牌本质上是“随机值 + 映射表”的间接可逆方案。
格式保留令牌(FPE,Format-Preserving Encryption/Tokenization)在保持原字段长度、字符集和校验位结构的前提下生成令牌。例如 16 位银行卡号仍为 16 位数字且通过 Luhn 校验,手机号仍为 11 位数字。它适合数据库列类型和长度不能改、下游系统有格式校验的场景,但算法实现复杂,需严格控制 tweak 和密钥管理。
可逆令牌指通过密钥可直接解密还原明文的令牌,典型实现是 AES-SIV、AES-GCM 等确定性或随机化加密。它不需要令牌库,适合跨系统、离线或高可用场景,但密钥一旦泄露,全部数据可被还原。
不可逆令牌通常指单向哈希(如 HMAC-SHA-256)加盐后的摘要。它无法还原,适合仅用于比对、去重或关联分析的字段,例如身份证号的比对索引。但哈希存在字典攻击风险,必须使用带密钥的 HMAC 和高熵盐。
工程权衡的四个维度
安全强度:不可逆令牌和随机令牌不暴露明文与令牌的数学关系,安全性最高;可逆令牌依赖密钥保护,密钥泄露即全量失守;格式保留令牌因空间受限(如 11 位数字仅约 1011 种可能),在已知明文攻击下风险高于前两者,必须配合强密钥和 tweak。
业务可用性:格式保留令牌可直接写入原有列,下游无需改造;可逆令牌需要调用解密接口;随机令牌需要查令牌库;不可逆令牌无法还原,只能用于比对。若业务需要展示掩码后的卡号后四位,格式保留或可逆方案更合适。
系统改造代价:格式保留令牌几乎零改造,但算法实现和密钥轮换复杂;随机令牌需要新建令牌库并保证高可用;可逆令牌需要密钥管理服务(KMS);不可逆令牌最简单,但功能受限。
合规与审计:PCI DSS 要求卡号令牌化后不可还原,此时应优先随机令牌或不可逆令牌;若监管要求可追溯,则需可逆方案并记录解密审计日志。
选型决策的实操方法
实际选型可按以下顺序判断:第一步,确认字段是否需要还原。若仅用于比对、去重、关联,选不可逆令牌(HMAC-SHA-256 + 高熵盐)。第二步,若需还原,判断是否必须保持原格式。若数据库列类型、长度、校验规则不可改,选格式保留令牌(FF1 或 FF3-1)。第三步,若格式可改但需还原,判断是否允许维护令牌库。若允许且要求最高安全,选随机令牌 + 令牌库;若不允许(如离线、跨系统、高可用要求),选可逆令牌(AES-SIV 确定性加密)。
以一个典型场景为例:某支付系统需对银行卡号、手机号、身份证号分别处理。卡号需展示后四位且下游有 Luhn 校验,选格式保留令牌;手机号仅用于短信发送,需还原,选可逆令牌;身份证号仅用于风控比对,选不可逆令牌。同一系统内混用四类算法是常态,关键是按字段逐一评估。
- 该字段是否需要还原明文?否 → 不可逆令牌。
- 是否需要保持长度、字符集、校验位?是 → 格式保留令牌。
- 是否允许维护高可用令牌库?是 → 随机令牌;否 → 可逆令牌。
- 密钥是否可由 KMS 托管并支持轮换?否 → 重新评估可逆方案。
- 是否有合规要求禁止还原?是 → 随机或不可逆令牌。
常见误区与规避
误区一:认为格式保留令牌“最安全”。实际上其令牌空间受原格式限制,必须使用足够强的密钥和 tweak,并避免在低熵字段(如 6 位验证码)上使用。误区二:用普通哈希代替 HMAC。无密钥哈希易被彩虹表攻击,必须使用带密钥的 HMAC 并加盐。误区三:随机令牌不建令牌库。随机令牌本身不可逆,若业务需要还原,必须配套令牌库,否则无法使用。误区四:忽略密钥轮换。可逆和格式保留方案必须设计密钥版本号,支持旧数据逐步重加密。
选型的最终判断标准是:在满足安全与合规底线的前提下,选择对现有系统改造最小、业务可用性最高的方案。没有万能算法,只有与字段需求匹配的算法组合。