

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

產生 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`必須是 hexBinary 資料。

如需此 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 個十六進位字元。

您可以透過呼叫 [CreateKey](https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_CreateKey.html) 來建立 MAC AWS 金鑰，或呼叫 [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 設定為 `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"
}
```