使用 AWS 支付加密服务将支付处理迁移到云端

了解如何借助 AWS 支付加密服务,摆脱预置和管理本地支付 HSM,避免容易出错的密钥交换流程。

AWS Payment Cryptography
教程
亚马逊云科技
Olawale Olaleye
难度
100 - 初级
时间
20 分钟
前提条件

海外区域: 注册 / 登录 亚马逊云科技

上次更新时间
2023 年 6 月 14 日

介绍 AWS 支付加密服务

AWS 支付加密服务简化了您对加密功能和密钥管理的实施,这些功能和密钥管理用于根据各种支付卡行业 (PCI) 标准来保护支付处理中的数据。

借助 AWS 支付加密服务,您无需预置和管理本地支付 HSM,并可使用提供的工具来避免容易出错的密钥交换流程。例如,使用 AWS 支付加密服务,支付和金融服务提供商可以在几分钟内开始开发,并且可以计划以电子方式交换密钥,从而消除手动流程。

为了以合规方式提供弹性加密功能,AWS 支付加密服务采用获得 PCI PTS HSM 设备批准的 HSM。这些功能包括卡数据的加密和解密、密钥创建和密码转换。AWS 支付加密服务还根据 PCI DSS、PCI PIN 和 PCI P2PE 等 PCI 安全标准进行设计,并且提供证据和报告来帮助满足您的合规需求。

您可以使用 ANSI X9 TR-31 协议。通过密钥加密密钥(KEK)在 AWS Payment Cryptography 和本地 HSM 之间导入和导出对称密钥。您还可以使用 ANSI X9 TR-34 协议通过其他系统和设备导入和导出对称 KEK,该协议允许该服务使用非对称技术交换对称密钥。

为了简化将消费者支付处理迁移到云端的过程,现有的卡支付应用程序可以通过 AWS 软件开发工具包使用 AWS 支付加密服务。这样,您就可以使用自己喜欢的编程语言(例如 Java 或 Python),而不是支付 HSM 中常用的基于 TCP 套接字的供应商特定 ASCII 接口。

可以使用 AWS Identity and Access Management (AWS IAM) 基于身份的策略来授权访问权限,您可以在该策略中指定允许或拒绝哪些操作和资源以及具体条件。

监控对于维护支付处理所需的可靠性、可用性和性能非常重要。借助 AWS 支付加密服务,您可以使用 Amazon CloudWatchAWS CloudTrail 和 Amazon EventBridge 来了解正在发生的情况,在出现问题时报告并在适当时自动采取行动。

我们来看看该方法的实际应用。

使用 AWS 支付加密服务

我使用 AWS 命令行界面 (AWS CLI) 创建了一个两倍长度的 3DES 密钥用作卡验证密钥 (CVK)。CVK 是用于生成和验证卡安全码(例如 CVV、CVV2 和类似值)的密钥。

请注意,CLI 有两个命令(同样有两个适用于 API 和 SDK 的端点):

  • payment-cryptography 用于控制面板操作,例如列出和创建密钥和别名。
  • payment-cryptography-data 用于使用密钥的加密操作,例如,生成 PIN 或卡验证数据。

创建密钥是控制面板操作:

aws payment-cryptography create-key \
    --no-exportable \
    --key-attributes KeyAlgorithm=TDES_2KEY,
                     KeyUsage=TR31_C0_CARD_VERIFICATION_KEY,
                     KeyClass=SYMMETRIC_KEY,
                     KeyModesOfUse='{Generate=true,Verify=true}'
{
    "Key": {
        "KeyArn": "arn:aws:payment-cryptography:us-west-2:123412341234:key/42cdc4ocf45mg54h",
        "KeyAttributes": {
            "KeyUsage": "TR31_C0_CARD_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": "B2DD4E",
        "KeyCheckValueAlgorithm": "ANSI_X9_24",
        "Enabled": true,
        "Exportable": false,
        "KeyState": "CREATE_COMPLETE",
        "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
        "CreateTimestamp": "2023-05-26T14:25:48.240000+01:00",
        "UsageStartTimestamp": "2023-05-26T14:25:48.220000+01:00"
    }
}

要在接下来的步骤中引用此密钥,我可以使用在 KeyARN 属性中找到的 Amazon 资源名称 (ARN),也可以创建别名。别名是一个友好的名称,让我不必使用完整的 ARN 即可引用密钥。我可以通过更新别名来引用不同的密钥。当我需要替换密钥时,可以更新别名,而不必更改应用程序的配置或代码。为了便于识别,别名以 alias/ 开头。例如,以下命令将为我刚刚创建的密钥创建别名 alias/my-key:

aws payment-cryptography create-alias --alias-name alias/my-key \
    --key-arn arn:aws:payment-cryptography:us-west-2:123412341234:key/42cdc4ocf45mg54h
{
    "Alias": {
        "AliasName": "alias/my-key",
        "KeyArn": "arn:aws:payment-cryptography:us-west-2:123412341234:key/42cdc4ocf45mg54h"
    }
}

在开始使用新密钥之前,我会列出所有密钥以检查其状态:

aws payment-cryptography list-keys
{
    "Keys": [
        {
            "KeyArn": "arn:aws:payment-cryptography:us-west-2:123421341234:key/42cdc4ocf45mg54h",
            "KeyAttributes": {
                "KeyUsage": "TR31_C0_CARD_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": "B2DD4E",
            "Enabled": true,
            "Exportable": false,
            "KeyState": "CREATE_COMPLETE"
        },
        {
            "KeyArn": "arn:aws:payment-cryptography:us-west-2:123412341234:key/ok4oliaxyxbjuibp",
            "KeyAttributes": {
                "KeyUsage": "TR31_C0_CARD_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": "905848",
            "Enabled": true,
            "Exportable": false,
            "KeyState": "DELETE_PENDING"
        }
    ]
}

如您所见,我之前创建了另一个密钥,该密钥之后已被删除。被删除的密钥将被标记以供删除(DELETE_PENDING)。实际删除将在可配置的时间段(默认为 7 天)之后发生。这是一种安全机制,可以防止意外或恶意删除密钥。标记以供删除的密钥不可用,但可以恢复。

我通过类似的方式列出我所有的别名,看看它们指的是哪些密钥:

aws payment-cryptography list-aliases
{
    "Aliases": [
        {
            "AliasName": "alias/my-key",
            "KeyArn": "arn:aws:payment-cryptography:us-west-2:123412341234:key/42cdc4ocf45mg54h"
        }
    ]
}

现在,我使用密钥通过 CVV2 身份验证系统生成卡安全码。您可能对 CVV2 编号(通常写在信用卡背面)比较熟悉。这就是它们的计算方式。我提供信用卡的主账号、信用卡到期日和上一步的密钥作为输入。我使用密钥的别名来指定密钥。这是数据面板操作:

aws payment-cryptography-data generate-card-validation-data \
    --key-identifier alias/my-key \
    --primary-account-number=171234567890123 \
    --generation-attributes CardVerificationValue2={CardExpiryDate=0124}
{
    "KeyArn": "arn:aws:payment-cryptography:us-west-2:123412341234:key/42cdc4ocf45mg54h",
    "KeyCheckValue": "B2DD4E",
    "ValidationData": "343"
}

我记下了 ValidationData 属性中的三位数。在处理付款时,我可以验证卡数据值是否正确:

aws payment-cryptography-data verify-card-validation-data \
    --key-identifier alias/my-key \
    --primary-account-number=171234567890123 \
    --verification-attributes CardVerificationValue2={CardExpiryDate=0124} \
    --validation-data 343
{
    "KeyArn": "arn:aws:payment-cryptography:us-west-2:123412341234:key/42cdc4ocf45mg54h",
    "KeyCheckValue": "B2DD4E"
}

验证成功,系统将返回与生成验证数据时相同的 KeyCheckValue 值。

正如您所预料的那样,如果我使用了错误的验证数据,则验证将不成功,同时我会收到一个错误:

aws payment-cryptography-data verify-card-validation-data \
    --key-identifier alias/my-key \
    --primary-account-number=171234567890123 \
    --verification-attributes CardVerificationValue2={CardExpiryDate=0124} \
    --validation-data 999

An error occurred (com.amazonaws.paymentcryptography.exception#VerificationFailedException)
when calling the VerifyCardValidationData operation:
Card validation data verification failed

在 AWS 支付加密服务控制台中,我选择查看密钥以查看密钥列表。

或者,我可以启用更多列,以便执行例如查看密钥类型(对称/非对称)和所使用的算法等操作。

我选择上一个示例中使用的密钥来获取更多详细信息。在这里,我看到了加密配置、分配给密钥的标签以及引用该密钥的别名。

AWS 支付密码服务支持的操作远不止我在这里展示的这些。在本演练中,我使用了 AWS CLI。在您的应用程序中,您可以通过任何 AWS 软件开发工具包来使用 AWS 支付加密服务。

可用性和定价

AWS 支付加密服务现已在以下 AWS 区域推出:美国东部(弗吉尼亚州北部)和美国西部(俄勒冈州)。

使用 AWS 支付加密服务,您只需根据活跃密钥数和 API 调用次数按实际用量付费,无需预先承诺,也没有最低费用。 有关更多信息,请参阅 AWS 支付加密服务定价

AWS 支付加密服务让您可以摆脱对专用支付 HSM 和传统密钥管理系统的依赖,简化了与 AWS 原生 API 的集成。此外,通过在云端运行整个支付应用程序,您可以最大限度地减少来回通信和延迟。

使用 AWS 支付加密服务将您的支付处理应用程序迁移到云端。