

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 生成 MAC
<a name="generate-mac"></a>

Generate MAC API 用于验证与卡相关的数据，例如来自卡片磁条的跟踪数据，方法是使用已知的加密密钥生成 MAC（消息身份验证码），用于在发送方和接收方之间进行数据验证。用于生成 MAC 的数据包括消息数据、机密 MAC 加密密钥和 MAC 算法，用于生成用于传输的唯一 MAC 值。MAC 的接收方将使用相同的 MAC 消息数据、MAC 加密密钥和算法来重现另一个 MAC 值以进行比较和数据验证。即使是消息的一个字符发生了变化，或者用于验证的 MAC 密钥不完全相同，生成的MAC 也会完全不同。该 API 支持用于此操作的 ISO 9797-1 算法 1 和 ISO 9797-1 算法 3 MAC（使用静态 MAC 密钥和派生的 DUKPT 密钥）、HMAC 和 EMV MAC 加密密钥。

`message-data` 的输入值必须是十六进制数据。

有关此 API 所有选项的更多信息，请参阅[GenerateMac](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GenerateMac.html)和[VerifyMac](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_VerifyMac.html)。

可选参数 mac-length 允许您截断输出值（尽管这也可以在代码中完成）。长度为 8 表示 8 字节或 16 个十六进制字符。

MAC 密钥既可以通过 P AWS ayment Cryptography 通过调用创建，[CreateKey](https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_CreateKey.html)也可以通过调用[ImportKey](https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ImportKey.html)来 

**注意**  
CMAC 和 HMAC 算法不需要填充。所有其他数据都要求将数据填充到算法的区块大小，TDES 为 8 字节（16 个十六进制字符），AES 为 16 字节（32 个十六进制字符）的倍数。

**Topics**
+ [生成 HMAC](#generate-mac-hmac)
+ [使用 ISO 9797-1 算法 3 生成 MAC](#generate-mac-iso9797-alg3)
+ [使用 CMAC 生成 MAC](#generate-mac-cmac)
+ [使用 DUKPT CMAC 生成 MAC](#generate-mac-dukpt-cmac)

## 生成 HMAC
<a name="generate-mac-hmac"></a>

在此示例中，我们将使用 HMAC 算法 `HMAC_SHA256` 和 HMAC 加密密钥生成用于卡数据身份验证的 HMAC（基于哈希的消息身份验证代码）。密钥必须 KeyUsage 设置为，`TR31_M7_HMAC_KEY`并设置 KeyModesOfUse 为`Generate`。哈希长度（例如 256）是在创建密钥时定义的，无法修改。

可选的 mac-length 参数将修剪输出 MAC，尽管这也可以在服务外部执行。该值以字节为单位，因此，如果值为 16，则需要长度为 32 的十六进制字符串。

**Example**  

```
$ aws payment-cryptography-data generate-mac \ 
    --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/qnobl5lghrzunce6 \ 
    --message-data "3b313038383439303031303733393431353d32343038323236303030373030303f33" \
    --generation-attributes Algorithm=HMAC
```

```
           
{
    "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/qnobl5lghrzunce6",
    "KeyCheckValue": "2976E7",
    "Mac": "ED87F26E961C6D0DDB78DA5038AA2BDDEA0DCE03E5B5E96BDDD494F4A7AA470C"
}
```

## 使用 ISO 9797-1 算法 3 生成 MAC
<a name="generate-mac-iso9797-alg3"></a>

在本示例中，我们将使用 ISO 9797-1 算法 3（零售 MAC）生成 MAC，用于信用卡数据身份验证。密钥必须 KeyUsage 设置为，`TR31_M3_ISO_9797_3_MAC_KEY`并设置 KeyModesOfUse 为`Generate`。

**Example**  

```
$ aws payment-cryptography-data generate-mac \ 
    --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/kwapwa6qaifllw2h \ 
    --message-data "3b313038383439303031303733393431353d32343038323236303030373030303f33" \ 
    --generation-attributes="Algorithm=ISO9797_ALGORITHM3"
```

```
           
{
    "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/kwapwa6qaifllw2h",
    "KeyCheckValue": "2976EA",
    "Mac": "A8F7A73DAF87B6D0"
}
```

## 使用 CMAC 生成 MAC
<a name="generate-mac-cmac"></a>

当密钥为 AES 时，最常使用 CMAC，但它也支持 TDES。在此示例中，我们将使用 CMAC（ISO 9797-1 算法 5）生成一个 MAC，用于使用 AES 密钥进行卡数据身份验证。密钥必须 KeyUsage 设置为，`TR31_M6_ISO_9797_5_CMAC_KEY`并设置 KeyModesOfUse 为`Generate`。

**Example**  

```
$ aws payment-cryptography-data generate-mac \ 
    --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/tqv5yij6wtxx64pi \ 
    --message-data "3b313038383439303031303733393431353d32343038323236303030373030303f33" \ 
    --generation-attributes Algorithm="CMAC"
```

```
           
{
    "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/tqv5yij6wtxx64pi",
    "KeyCheckValue": "C1EB8F",
    "Mac": "1F8C36E63F91E4E93DF7842BF5E2E5F7"
}
```

## 使用 DUKPT CMAC 生成 MAC
<a name="generate-mac-dukpt-cmac"></a>

在此示例中，我们将使用 DUKPT（每笔交易派生的唯一密钥）和 CMAC 生成一个 MAC，用于卡数据身份验证。密钥必须 KeyUsage 设置为 true `TR31_B0_BASE_DERIVATION_KEY` 并 KeyModesOfUse `DeriveKey`设置为 true。DUKPT 密钥使用基本派生密钥 (BDK) 和密钥序列号 (KSN) 为每笔交易派生一个唯一的密钥。



**Example**  

```
$ aws payment-cryptography-data generate-mac --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/qnobl5lghrzunce6 --message-data "3b313038383439303031303733393431353d32343038323236303030373030303f33" --generation-attributes="DukptCmac={KeySerialNumber="932A6E954ABB32DD00000001",Direction=BIDIRECTIONAL}"
```

```
       
{
    "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/qnobl5lghrzunce6",
    "KeyCheckValue": "C1EB8F"
}
```