生成一个随机引脚和关联的 PVV,然后验证该值 - AWS 支付密码学

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

生成一个随机引脚和关联的 PVV,然后验证该值

创建密钥

为了生成随机 PIN 和 PVV,你需要两个密钥,一个用于生成 PVV 的 P in 验证密钥 (PVK) 和一个用于加密 PIN 的 P in 加密密钥。PIN 本身是在服务内部安全地随机生成的,并且在加密方面与任何一个密钥都没有关系。

PGK 必须是基于 PVV 算法本身的算法 TDES_2KEY 的密钥。PEK 可以是 TDES_2KEY、TDES_3KEY 或 AES_128。在这种情况下,由于 PEK 仅供系统内部使用,因此 AES_128 将是一个不错的选择。如果PEK用于与其他系统(例如卡网络、收单机构 ATMs)交换或作为迁移的一部分进行移动,则出于兼容性考虑,TDES_2KEY可能是更合适的选择。

创建 PEK

$ aws payment-cryptography create-key \ --exportable --key-attributes KeyAlgorithm=AES_128,KeyUsage=TR31_P0_PIN_ENCRYPTION_KEY,\ KeyClass=SYMMETRIC_KEY,\ KeyModesOfUse='{Encrypt=true,Decrypt=true,Wrap=true,Unwrap=true}' --tags='[{"Key":"CARD_BIN","Value":"12345678"}]'

响应会回显请求参数,包括后续调用的 ARN 以及密钥检查值 (KCV)。

{ "Key": { "KeyArn": "arn:aws:payment-cryptography:us-east-2::key/ivi5ksfsuplneuyt", "KeyAttributes": { "KeyUsage": "TR31_P0_PIN_ENCRYPTION_KEY", "KeyClass": "SYMMETRIC_KEY", "KeyAlgorithm": "AES_128", "KeyModesOfUse": { "Encrypt": false, "Decrypt": false, "Wrap": false, "Unwrap": false, "Generate": true, "Sign": false, "Verify": true, "DeriveKey": false, "NoRestrictions": false } }, "KeyCheckValue": "7CC9E2", "KeyCheckValueAlgorithm": "CMAC", "Enabled": true, "Exportable": true, "KeyState": "CREATE_COMPLETE", "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY", "CreateTimestamp": "2023-06-05T06:41:46.648000-07:00", "UsageStartTimestamp": "2023-06-05T06:41:46.626000-07:00" } }

注意代表密钥的那个KeyArn,例如 arn: aws: payment-cryptography: us-east-2:: key/ivi5ksfsupln euyt。您需要在下一步中执行该操作。

创建 PVK

$ aws payment-cryptography create-key --exportable --key-attributes KeyAlgorithm=TDES_2KEY,KeyUsage=TR31_V2_VISA_PIN_VERIFICATION_KEY,KeyClass=SYMMETRIC_KEY,KeyModesOfUse='{Generate=true,Verify=true}' --tags='[{"Key":"CARD_BIN","Value":"12345678"}]'

响应会回显请求参数,包括后续调用的 ARN 以及密钥检查值 (KCV)。

{ "Key": { "KeyArn": "arn:aws:payment-cryptography:us-east-2::key/ov6icy4ryas4zcza", "KeyAttributes": { "KeyUsage": "TR31_V2_VISA_PIN_VERIFICATION_KEY", "KeyClass": "SYMMETRIC_KEY", "KeyAlgorithm": "TDES_2KEY", "KeyModesOfUse": { "Encrypt": false, "Decrypt": false, "Wrap": false, "Unwrap": false, "Generate": true, "Sign": false, "Verify": true, "DeriveKey": false, "NoRestrictions": false } }, "KeyCheckValue": "51A200", "KeyCheckValueAlgorithm": "ANSI_X9_24", "Enabled": true, "Exportable": true, "KeyState": "CREATE_COMPLETE", "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY", "CreateTimestamp": "2023-06-05T06:41:46.648000-07:00", "UsageStartTimestamp": "2023-06-05T06:41:46.626000-07:00" } }

注意代表密钥的那个KeyArn,例如 arn: aws: payment-cryptography: us-east-2:: key/ov6icy4r yas4ryas4zcza。您需要在下一步中执行该操作。

生成一个随机密码,生成 PVV 并返回加密的 PIN 和 PVV

在此示例中,我们将生成一个新的(随机)4 位数引脚,其中的输出将是加密的 PIN block (PinData. PinBlock) 和 a PVV (pinData。 VerificationValue)。密钥输入是 PANPin Verification Key(也称为引脚生成密钥)、Pin Encryption KeyPIN 块格式。

此命令要求密钥的类型为TR31_V2_VISA_PIN_VERIFICATION_KEY

$ aws payment-cryptography-data generate-pin-data --generation-key-identifier arn:aws:payment-cryptography:us-east-2::key/37y2tsl45p5zjbh2 --encryption-key-identifier arn:aws:payment-cryptography:us-east-2::key/ivi5ksfsuplneuyt --primary-account-number 171234567890123 --pin-block-format ISO_FORMAT_0 --generation-attributes VisaPin={PinVerificationKeyIndex=1}
{ "GenerationKeyArn": "arn:aws:payment-cryptography:us-east-2::key/37y2tsl45p5zjbh2", "GenerationKeyCheckValue": "7F2363", "EncryptionKeyArn": "arn:aws:payment-cryptography:us-east-2::key/ivi5ksfsuplneuyt", "EncryptionKeyCheckValue": "7CC9E2", "EncryptedPinBlock": "AC17DC148BDA645E", "PinData": { "VerificationValue": "5507" } }

使用 PVV 方法验证加密的 PIN

在此示例中,我们将验证给定 PAN 的 PIN。PIN 通常由持卡人或用户在交易期间提供以进行验证,并与存档的值进行比较(持卡人的输入以加密值形式由终端或其他上游提供商提供)。为了验证此输入,还将在运行时提供以下值——加密的 pin 码、用于加密输入 pin 的密钥(通常称为 IWKPAN以及要验证的值(a PVVPIN offset)。

如果 P AWS ayment Cryptography 能够验证密码,则会返回 http/200。如果 pin 未经过验证,将返回 http/400。

$ aws payment-cryptography-data verify-pin-data --verification-key-identifier arn:aws:payment-cryptography:us-east-2::key/37y2tsl45p5zjbh2 --encryption-key-identifier arn:aws:payment-cryptography:us-east-2::key/ivi5ksfsuplneuyt --primary-account-number 171234567890123 --pin-block-format ISO_FORMAT_0 --verification-attributes VisaPin="{PinVerificationKeyIndex=1,VerificationValue=5507}" --encrypted-pin-block AC17DC148BDA645E
{ "VerificationKeyArn": "arn:aws:payment-cryptography:us-east-2::key/37y2tsl45p5zjbh2", "VerificationKeyCheckValue": "7F2363", "EncryptionKeyArn": "arn:aws:payment-cryptography:us-east-2::key/ivi5ksfsuplneuyt", "EncryptionKeyCheckValue": "7CC9E2", }