卡验证值 (CVV) 和卡验证码 (CVC) 是防止卡片欺诈的安全功能。本指南解释它们是如何通过加密方式生成的。
卡验证值的类型
CVV1(磁条)
- 编码在磁条上(磁道 1 和磁道 2)
- 用于"有卡"的现场交易
- 3 位数字
CVV2/CVC2(印刷)
- 印在卡上(Visa/MC 在背面,Amex 在正面)
- 用于"无卡"交易(在线/电话)
- 3 位数字(Visa/MC)或 4 位数字(Amex)
iCVV(集成电路)
- 存储在芯片中
- 与 CVV1 不同,以防止盗刷攻击
- 用于验证芯片存在
动态 CVV/CVC3
- 由非接触式/芯片每次交易生成
- 不断变化以增加安全性
CVV 计算过程
输入数据
- 主账号 (PAN):16 位卡号
- 有效期:MMYY 或 YYMM 格式
- 服务代码:3 位数字(如 101、201)
- CVK A 和 CVK B:卡验证密钥(各 16 个十六进制字符)
算法步骤
步骤 1:准备数据块
连接 PAN(右对齐)+ 有效期 + 服务代码,填充到 32 个十六进制:
块 A:PAN[12位] + 有效期[4位] + 服务代码[3位] + 填充
块 B:剩余 PAN 数字 + 填充
步骤 2:加密块 A
加密_A = 3DES_Encrypt(CVK_A, 块_A)
步骤 3:与块 B 进行 XOR
XOR结果 = 加密_A XOR 块_B
步骤 4:再次加密
加密_B = 3DES_Encrypt(CVK_A, XOR结果)
步骤 5:十进制化
从结果中提取数字:
- 将十六进制字符 0-9 作为数字
- 对于 A-F,减去 10 得到 0-5
- 取前 3 位(Amex 取 4 位)数字
示例
给定:
- PAN:
4012345678901234 - 有效期:
2512(2025年12月) - 服务代码:
101 - CVK:
0123456789ABCDEF FEDCBA9876543210
结果:CVV = 123(示例)
CVV2 与 CVV1 的区别
| 属性 | CVV1 | CVV2 |
|---|---|---|
| 位置 | 磁条 | 印在卡上 |
| 服务代码 | 101 | 000 |
| 用途 | 有卡交易 | 无卡交易 |
| 可被盗刷 | 是 | 否(不在磁条上) |
安全特性
- 单向函数:无法从 CVV 反向工程出 CVK
- 密钥依赖性:不同的 CVK 产生不同的 CVV
- 输入敏感性:PAN/有效期的任何变化都会改变 CVV
为什么动态 CVV 很重要
传统 CVV 是静态的 - 一旦被盗,可以重复使用。动态 CVV (CVC3) 使用以下信息在每次交易时变化:
- 应用交易计数器 (ATC)
- 不可预测数 (UN)
- 卡片特定密钥(从 IMK 派生)
这使得被盗的值对未来交易毫无用处。
自己动手试试
使用我们的 CVV 计算器:
- 计算 CVV/CVV2/iCVV
- 验证现有的 CVV 值
- 了解逐步过程
- 使用示例数据测试