使用 AWS 支付加密服务将支付处理迁移到云端
了解如何借助 AWS 支付加密服务,摆脱预置和管理本地支付 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 的集成。此外,通过在云端运行整个支付应用程序,您可以最大限度地减少来回通信和延迟。