2. 脱机交易核心流程:终端行为分析(TAC)、卡片行为分析(CAC)、应用密码生成、交易数据认证
各位好,我是老张。今天咱们聊聊脱机交易里最核心的几个环节。说实话,这章内容有点绕,但搞懂了,你就能理解EMV脱机交易的整个骨架。
我刚开始接触EMV时,总觉得脱机交易不就是卡片和终端互相打个招呼吗?后来踩了坑才明白——这里面的门道深着呢。终端行为分析、卡片行为分析、应用密码生成、交易数据认证,这四个环节环环相扣,少一个都不行。
2.1 终端行为分析(TAC)——终端说了算
终端行为分析,英文叫 Terminal Action Analysis,简称 TAC。说白了,就是终端根据自己的一套规则,判断这笔交易能不能脱机完成。
终端里存着一组参数,叫 TAC(Terminal Action Code)。这玩意儿分三种:
- TAC-Denial:碰到这种情况,直接拒绝交易,没商量
- TAC-Online:这种情况必须联机,不能脱机
- TAC-Default:默认情况下怎么处理
我举个例子你就明白了。假设终端设置的 TAC-Denial 里有一条:交易金额超过 1000 元直接拒绝。那用户拿卡刷 1200 块,终端二话不说就拒了。为什么?因为终端觉得风险太高,不想担责。
关键点:TAC 是终端的「底线」。终端通过 TAC 告诉卡片:哪些情况我接受不了,哪些情况你得去联机问问。
实际项目中,我见过不少终端厂商把 TAC 配得太松。结果呢?大额交易全走脱机,最后清算时对不上账,哭都来不及。所以我的建议是:TAC-Denial 要严格,TAC-Online 要合理,别一刀切。
2.2 卡片行为分析(CAC)——卡片也有自己的小算盘
终端分析完了,轮到卡片了。卡片行为分析,Card Action Analysis,简称 CAC。卡片里也存着一套参数,叫 CVR(Card Verification Results),记录着卡片自己的判断结果。
卡片会检查什么呢?我列一下:
- 交易金额是否超过卡片设定的脱机限额
- 当日累计交易金额是否超限
- 卡片是否在终端上被「暴力」操作(比如连续输错 PIN)
- 应用版本是否匹配
卡片分析完后,会生成一个 CVR,告诉终端:我觉得这笔交易风险高不高。
避坑指南:我曾经遇到过一个案例,卡片 CAC 里把脱机限额设得特别高,结果卡片被复制后,犯罪分子在脱机环境下刷走了大笔资金。所以 CAC 参数一定要和发卡行的风控策略对齐,别图省事。
这里有个细节要注意:CAC 和 TAC 是独立运行的。终端管终端的,卡片管卡片的。最后两者结果一综合,才决定这笔交易走脱机、联机还是直接拒绝。
2.3 应用密码生成——给交易上把锁
前面两个分析做完,接下来要生成密码了。这个密码不是咱们平时输的 PIN 码,而是应用密码,也叫交易密码。
EMV 里定义了三种应用密码:
| 密码类型 | 英文缩写 | 含义 | 使用场景 |
|---|---|---|---|
| 授权请求密码 | ARQC | 联机授权时使用 | 终端要求联机时,卡片生成 ARQC |
| 交易证书 | TC | 脱机批准时使用 | 终端和卡片都同意脱机时,卡片生成 TC |
| 应用认证密码 | AAC | 交易被拒绝时使用 | 任何一方拒绝交易时,卡片生成 AAC |
密码生成的过程,说白了就是卡片用私钥对交易数据签名。签名用的数据包括:金额、货币代码、交易日期、终端编号、不可预测数等等。这些数据组合在一起,叫 动态数据认证数据对象列表(DDOL)。
// 伪代码示例:ARQC 生成过程
function generateARQC(transactionData, cardPrivateKey) {
// 1. 构建待签名数据
let dataToSign = buildDDOL(transactionData);
// 2. 使用卡片私钥签名
let signature = RSA_Sign(cardPrivateKey, dataToSign);
// 3. 返回 ARQC
return signature;
}
注意:ARQC 和 TC 的生成算法是一样的,区别在于使用的密钥不同。ARQC 用会话密钥,TC 用静态密钥。这个细节很多人搞混,我当年也栽过跟头。
2.4 交易数据认证——验明正身
最后一步,交易数据认证。这一步的目的是验证卡片是不是真的,交易数据有没有被篡改。
EMV 提供了三种认证方式:
- SDA(静态数据认证):用发卡行公钥验证卡片静态数据。说白了就是验个身份证,看看卡片是不是真的。
- DDA(动态数据认证):卡片用私钥对随机数签名,终端用公钥验签。比 SDA 强,能防重放攻击。
- CDA(组合数据认证):把 DDA 和交易数据签名合在一起做。这是目前最安全的方案。
我个人习惯是:能用 CDA 就别用 SDA。SDA 只能防复制卡,防不了中间人攻击。DDA 好一些,但 CDA 才是王道。
实战经验:我在某支付机构做项目时,发现他们的终端只支持 SDA。结果呢?犯罪分子用读卡器截获了卡片静态数据,伪造了一批卡。好在金额不大,没造成太大损失。后来我建议他们升级到 CDA,问题才解决。
认证流程大致是这样的:
- 终端向卡片发送一个随机数(不可预测数)
- 卡片用私钥对随机数 + 交易数据签名
- 终端用卡片公钥验签
- 验签通过,说明卡片是真的,数据没被改过
嗯,这里要注意:卡片公钥是从发卡行公钥证书链里解出来的。如果证书链断了或者过期了,认证就会失败。所以终端里一定要维护好 CA 公钥列表,定期更新。
小结
这四个环节,说白了就是一套组合拳:
- TAC 和 CAC 负责「风险评估」
- 应用密码生成负责「交易授权」
- 交易数据认证负责「身份验证」
少了任何一个,脱机交易的安全防线就会出现缺口。我在实际工作中见过太多因为某个环节没做好而出事的案例。所以,别嫌麻烦,每个环节都要认真对待。
最后说一句:如果你在调试脱机交易时发现交易总是失败,先别急着怀疑卡片。检查一下 TAC 配置、CAC 参数、证书链是否完整。很多时候,问题出在终端上,而不是卡片上。
公众号:蓝海资料掘金营,微信deep3321