EMV ODA详解

 1. 选应用          SELECT(选 AID)
 2. 发起处理        GPO(拿 AIP、AFL)
 3. 读应用数据      READ RECORD
 4. 离线数据认证    ODA(SDA / DDA / CDA)
 5. 处理限制        Processing Restrictions
 6. 持卡人验证      CVM(PIN / 签名 / No-CVM)
 7. 终端风险管理    TRM
 8. 终端行为分析    TAA(TVR + TAC → 拒/联机/批准)
 9. 第一次 GEN AC   要 AAC / ARQC / TC
10. 联机授权        (若要 ARQC,送发卡行)
11. 第二次 GEN AC   (联机后,要 TC 或 AAC)
12. 交易完成        写记录、拔卡等

 

CDA(复合认证,分两类)
1)SDA+CDA 主流卡:静态 SDA 前置校验(GAC 前),动态 SDAD 校验在 GAC 返回后;
2)纯 CDA 无 SDA 卡:无前置 SDA,全部静态数据完整性校验依赖 GAC 返回的 SDAD 解密比对,TVR CDA Failed 在 GAC 后置位。

ODA(Offline Data Authentication,离线数据认证) 是 EMV 在不联机的情况下,终端验证「这张卡/这些数据是不是真的」的一套机制总称。

 

目的:证明卡是真卡,卡上关键数据没被改
时机:READ RECORD 之后、CVM 之前(大方向)
手段:SDA / DDA / CDA 三选一(看卡和终端能力)
 

image

 

SDA:用发卡行公钥校验卡片的完整性,用CA保证发卡行公钥的真实性,无法保证卡片被复制的情况

1. 验证卡片静态数据完整性:
   发卡行私钥签 签名SD → SSAD 写在卡上;
   终端用发卡行公钥验 SSAD。
  
2. 读 SD + SSAD,发公验签得 H1,自己 Hash(SD)=H2,相同 → 未篡改 3. 能保证数据完整性;但无法单独保证「是真卡」。 4. 为防止发卡行公被伪造,引入 CA: CA 私钥签「发卡行公钥证书」,证书在 ICC 上。 5. 终端用 CAPK 验证书 → 得到可信的发卡行公钥 → 再去做第 2 步。

 

DDA:DDA(Dynamic Data Authentication,动态数据认证) 在 SDA 基础上多了一步:让卡用 ICC 私钥当场签名,证明 「真卡在场、且有私钥」。

SDA:只验静态数据没被改(假卡也能复制)
DDA:静态可信 + 卡现场用私钥签名 → 防克隆

image

 

CA 私钥
  └── 签 ──► 发卡行公钥证书
                  │
发卡行私钥          │
  └── 签 ──► ICC 公钥证书(9F46)  
                  │
                  └── 里面是 ICC 公钥(模数、指数等)

ICC 私钥:在芯片里,用来 DDA/CDA 现场签名,不用于签自己的证书

防 ICC 被复制,依靠 DDA:

1:终端在取得可信 ICC 公钥后,生成每次不同的随机数发给卡片,由芯片内无法导出的 ICC 私钥当场签名,终端再用 ICC 公钥验签——克隆卡只能复制证书和静态数据,复制不了私钥,因而无法通过验证。

2:为保证终端使用的 ICC 公钥未被篡改,EMV 采用 CA → 发卡行 → ICC 的两级证书链:终端预装 CA 公钥(CAPK),先用其验证卡上的发卡行公钥证书并取得发卡行公钥,再用发卡行公钥验证 ICC 公钥证书并取得 ICC 公钥;

3:其中发卡行公钥证书由 CA 私钥签名,ICC 公钥证书由发卡行私钥签名。引入发卡行这一中间层,并非技术上 CA 不能直签 ICC,而是出于规模与分工——卡组织只需对少量发卡行背书,各发卡行再为自己发行的海量卡片签发 ICC 证书,既保证信任可追溯,又避免 CA 为每张卡直接签发的不可行。

4:综上,证书链解决「ICC 公钥是否可信」,DDA 解决「是否为真卡在场」,二者结合才能有效防范芯片复制。

 

 CDA:CDA(Combined Data Authentication,组合动态数据认证) 把 静态数据认证 和 动态数据认证 合成一步,并且和 GENERATE AC(产生应用密文) 绑在一起。

DDA:在 INTERNAL AUTHENTICATE 那一刻,能证明「真卡在场、能对本次 UN 签名」

到 GEN AC:要产生这笔交易的 ARQC/TC/AAC
         但 DDA 的验卡结果 没有和密码文绑在一起

所以中间人可以在两步之间动手脚,或者让 GEN AC 用的数据和 DDA 时不是同一套
→ 「之前验过真卡」≠ 「现在这张 AC 一定是真卡对这笔交易签的」

 

SDA:只验静态数据(不防克隆)
DDA:随机挑战 + ICC 私钥签名(防克隆)
CDA:静态 + 动态一起验,且绑在 GEN AC 里(现在主流)

image

 

 为什么CVMlist改变会CDA失败:

① 终端 READ RECORD 得到假 8E
   拼上其它静态数据 → Hash_fake(本地计算)

② GEN AC
   卡用 ICC 私钥对「真静态数据(含真 8E)+ 交易动态数据」签名
   返回 AC + 签名(不单独返回 hashReal)

③ 终端用 ICC 公钥验签
   把 Hash_fake + 动态数据代入 Verify
   → 和卡用真数据签出来的绑定点对不上
   → 验签失败 → CDA failed

 

 

 

 

 

posted @ 2026-07-25 00:25  蜗牛攀爬  阅读(20)  评论(0)    收藏  举报