# PIN PVV（VISA）：PIN 验证值计算

> VISA 的 PIN 验证值（PVV）系统工作原理——PDK 加密、PVKI 选择、PVV 计算和验证，以及与 PIN 偏移量的比较。

Canonical: https://hsmkit.com/zh/guides/pin-pvv-visa-verification/

Last updated: 2026-05-21

PIN 验证值（PVV）是 VISA 用于在 ATM 和 POS 终端验证 PIN 的方法。本指南解释 PVV 计算过程以及它与 IBM 3624 PIN 偏移量方法的区别。

## 什么是 PVV？

PVV（PIN 验证值）是从客户 PIN、卡的 PAN 和密钥派生的 4 位密码学值。它存储在磁条上，用于验证 PIN，而无需为每笔交易将实际 PIN 传输到发卡行。

PVV 比 [PIN 偏移量](/payments-pin-offset) 提供更强的安全性，因为验证值本身是密码学派生的，而不仅仅是算术差值。

## PVV 计算过程

### 输入数据

- **PIN**：客户的 4-12 位 PIN
- **PAN**：主账号（不含校验位）
- **PVK**：PIN 验证密钥（3DES 为 16 个十六进制字符）
- **PVKI**：PIN 验证密钥索引（0-6，选择使用哪个 PVK）

### 算法步骤

**步骤 1：选择 PVK**

PVKI 选择使用哪个 PIN 验证密钥：

```
PVK = PVK_集[PVKI]
```

这允许多个 PVK 同时处于活动状态，实现密钥轮换而无需重新发行卡。

**步骤 2：准备 PAN**

取 PAN 最右边 12 位数字（不含校验位）：

```
PAN_格式化 = PAN[4:16]（第 4 到第 15 位，从 0 开始索引）
```

**步骤 3：构造数据块**

连接 PAN 和 PIN：

```
数据块 = PAN_格式化 || PIN[0:4]
```

使用 PIN 的前 4 位数字。如果 PIN 长于 4 位，PVV 计算仅使用前 4 位。

**步骤 4：使用 PVK 加密**

使用选定的 PVK 通过 [3DES](/zh/guides/des-3des-legacy-encryption/) 加密数据块：

```
加密结果 = 3DES_Encrypt(PVK, 数据块)
```

**步骤 5：提取 PVV**

应用十进制化以提取 4 位 PVV：

1. 取加密结果的每个十六进制数字
2. 使用十进制化表映射到十进制
3. 选择前 4 位 0-9 的数字
4. 跳过十六进制数字 A-F

### 示例

给定：
- PIN：`1234`
- PAN：`4012345678901234`（校验位是 4）
- PVK：`0123456789ABCDEF FEDCBA9876543210`
- PVKI：`0`

**步骤 1：格式化 PAN**
```
最右边 12 位：012345678901
```

**步骤 2：构造数据块**
```
数据块 = 012345678901 || 1234 = 0123456789011234
```

**步骤 3：加密**
```
加密结果 = 3DES_Encrypt(PVK, 0123456789011234)
结果：A1B2C3D4E5F6A7B8
```

**步骤 4：十进制化**
```
A→0, 1→1, B→1, 2→2, C→2, 3→3, D→3, 4→4, E→4, 5→5, F→5, 6→6, A→0, 7→7, B→1, 8→8
十进制序列：0112233445560718
前 4 位有效数字：0112
```

**结果**：PVV = `0112`

## PVV 验证过程

当客户在 ATM 输入 PIN 时：

1. ATM 从磁条读取 PVV 和 PVKI
2. ATM 将加密的 PIN 块发送到主机
3. 主机的 [HSM](/zh/guides/hsm-key-management-overview/) 解密 PIN 块
4. HSM 使用 PVKI 选择 PVK
5. HSM 使用提交的 PIN、PAN 和 PVK 计算 PVV
6. HSM 将计算的 PVV 与存储的 PVV 进行比较
7. 如果匹配，验证成功

### HSM 命令流程

```
1. 从磁道 2 读取 PVV 和 PVKI
2. 解密 PIN 块 → 提取提交的 PIN
3. 使用 PVKI 选择 PVK
4. 构造数据块：PAN_格式化 || PIN[0:4]
5. 3DES_Encrypt(PVK, 数据块)
6. 十进制化 → 计算的 PVV
7. 比较(计算_PVV, 存储_PVV) → 结果
```

## PVKI（PIN 验证密钥索引）

PVKI 是存储在磁条上的单个数字（0-6），指示使用了哪个 PVK：

- **PVKI 0-6**：选择最多 7 个活动 PVK 中的一个
- **PVKI 7-9**：通常保留用于特殊目的

### 密钥轮换

PVKI 实现无缝密钥轮换：

1. 生成新 PVK 并分配给 PVKI=1
2. 新卡使用 PVKI=1 发行
3. 使用 PVKI=0 的旧卡继续工作
4. 最终淘汰 PVKI=0

## PVV 存储位置

PVV 存储在磁条的磁道 2 中：

```
磁道 2：PAN | 有效期 | 服务码 | PVKI + PVV + 其他数据
```

PVKI 和 PVV 共同占用自由数据字段中的 5 位数字。

## 安全特性

### 优势

1. **密码学验证**：PVV 是密码学哈希，不是算术偏移量
2. **密钥分离**：多个 PVK 可以同时处于活动状态
3. **无明文存储**：PVV 不会泄露 PIN
4. **标准化**：支付行业广泛支持

### 与 PIN 偏移量对比

| 特性 | PIN 偏移量 | PVV |
|------|------------|-----|
| 值类型 | 算术差值 | 密码学哈希 |
| 密钥使用 | 单个 PDK | 多个 PVK（通过 PVKI） |
| 安全性 | 中等 | 更高 |
| 可逆性 | 如果知道偏移量 + 自然 PIN 可以计算 PIN | 无法逆向得到 PIN |
| 存储 | 偏移量在磁条上 | PVV 在磁条上 |

## PVV 在 EMV 世界中

虽然 PVV 是为磁条交易设计的，但它在 EMV 中也很重要：

- **降级**：当芯片读取失败时，使用带有 PVV 的磁条
- **离线验证**：一些 EMV 实现使用 PVV 进行离线 PIN 验证
- **迁移**：卡可能同时具有 EMV 芯片和带有 PVV 的磁条

## 常见问题

### 可以从 PVV 计算出 PIN 吗？

不可以。PVV 是单向密码学函数。知道 PVV、PVK 和 PAN 无法恢复 PIN——只能验证提交的 PIN。

### 如果 PVKI 不存在怎么办？

如果 PVKI 缺失，假设使用默认 PVK（通常是 PVKI=0）。这在旧系统中很常见。

### PVV 与 CVV 有什么不同？

[CVV](/zh/guides/cvv-cvc-calculation-methods/) 通过验证卡数据来防止卡片欺诈。PVV 通过验证客户的 PIN 来防止 PIN 欺诈。它们使用不同的密钥，服务于不同的目的。

### 一张卡可以有多个 PVV 吗？

不可以。每张卡只有一个 PIN 对应一个 PVV。如果客户更改 PIN，会计算并存储新的 PVV。

## 亲自尝试

使用我们的 PVV 工具理解和验证 VISA PIN 验证值方法：

- [PIN PVV 计算器](/payments-pin-pvv) —— 从 PIN、PAN 和 PVK 计算 PVV，以及使用 PVV 方法验证 PIN

所有处理在您的浏览器本地完成——您的 PVK 不会离开您的设备。
