亚马逊AWS官方博客

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

加密技术已经渗透到我们日常生活的方方面面。阅读此博客即表示您正在使用 HTTPS。HTTPS 是 HTTP 的一项扩展,使用加密来保护通信。AWS 上有多项有助于管理密钥和加密的服务和功能,例如:

HSM 是安全保护加密操作以及这些操作所使用的密钥的物理设备。HSM 可以帮助您满足企业、合同和监管合规方面的要求。使用 CloudHSM,您可以访问通用型 HSM。涉及付款时,有特定的支付 HSM。这些 HSM 提供诸如生成和验证信用卡或借记卡的个人识别码(PIN)和安全码等功能。

今天,我很高兴地宣布 AWS Payment Cryptography 发布。这是一项弹性服务,用于管理云端支付处理应用程序的支付 HSM 和密钥。

使用支付 HSM 的应用程序具有一些极具挑战性的要求,因为支付处理非常复杂、具有时效性且受到严格监管,需要多个金融服务提供商和支付网络共同作用。每次付款时,都会在两个或多个金融服务提供商之间交换数据,并且每一步都必须使用唯一的密钥对其进行解密、转换和加密。

此过程需要各个支付服务提供商具有高性能的加密功能和密钥管理程序。这些提供商可能有数千个密钥需要保护、管理、轮换和审计,这使得整个流程昂贵且难以扩展。除此之外,支付 HSM 过去采用复杂且容易出错的流程,例如在安全房间内使用多张手工填写的纸质表格交换密钥,每张表格上都打印有不同的密钥组成部分。

介绍 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 CloudWatch、AWS 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 支付加密服务将您的支付处理应用程序迁移到云端。

— Danilo