4

我正在开发一种解决方案,旨在存储会员详细信息以及信用卡详细信息。我正在尽我所能遵守 PCI DSS。到目前为止,这是我的设计:

PAN = 主帐号 == 信用卡上的长号

  • 服务器 A 是远程服务器。它存储所有成员详细信息(姓名、地址等)并为每个存储的 PAN 提供单独的密钥 A
  • 服务器 B 是本地服务器,实际上保存着加密的 PAN 以及密钥 B,并进行解密。

要获得 PAN,客户端必须向两个服务器进行身份验证,向服务器 A 询问各自的密钥 A,然后将密钥 A 提供给服务器 B,服务器 B 会将 PAN 返回给客户端(前提是身份验证成功)。服务器 A 只会使用服务器 B 的公钥加密密钥 A,因为它会事先拥有它。不过,服务器 B 可能必须先发送盐,但我认为不必加密

关于上述内容,我还没有真正考虑过任何实现(即编码)细节,但是解决方案是使用 Java 的 Cajo 框架(RMI 的包装器),这就是服务器相互通信的方式(目前,成员资格详细信息已传输)这样)。

我希望服务器 B 而不是客户端进行解密的原因是我害怕解密密钥进入客户端的 RAM,即使它在服务器上可能同样糟糕......

有人能看出上述设计有什么问题吗?是否必须更改上述内容并不重要。

谢谢

杰尼尔

4

3 回答 3

6

作为前言,您将做噩梦般的时间来开发它并通过 PCI 合规性。绝对值得考虑替代方案,例如使用可以为您存储这些卡详细信息的支付服务提供商,并使用令牌 ID 执行临时授权/结算(而不是通过“拨号信用卡机器”键入它们)你描述的)

如果您选择忽略该建议并选择 PCI 路线,那么至少要确保尽早让 PCI 批准的合格安全评估员 (QSA) 参与其中,以批准您提出的任何设计。PCI 不是您应该“尽可能多地遵守”的东西,不幸的是,它是全有或全无的东西!

尽管如此,解决这个问题的一种方法是在盒子 A 上运行一个密钥服务应用程序。这个应用程序需要输入两个“密钥管理”密钥,当它们异或时一起形成一个主密钥。Master Key 只存储在 RAM 中,从不持久化到磁盘。

应用程序生成密钥加密密钥,存储在盒子 A 上,由主密钥加密。KEK 是自动生成的(不是用户键入的内容)。KEK 可以保存在盒子 A 上的磁盘上,由主密钥加密。

卡详细信息存储在框 B 中。此框还存储数据加密密钥,用于对卡详细信息执行对称加密。DEK 本身以加密格式存储,使用框 A 中的密钥加密密钥加密。

执行加密/解密的应用程序应该在盒子 B 上,并在请求 KEK 之前向盒子 A 验证自己。然后使用 KEK 解密 DEK,然后可以进行加密/解密。

于 2010-03-24T13:04:53.443 回答
1

如果服务器 A 被黑 - 这意味着我基本上仍然可以以明文形式获取所有信用卡,或者?然后,我可以访问所有个人 KEY 访问每张信用卡所需的信息。

于 2010-03-24T11:04:29.843 回答
0

您可能有兴趣阅读有关他们如何存储信用卡信息的Bytemark 博客条目。

要点是持有卡信息的服务器不会泄露号码;允许的操作是“添加新卡”、“更新或删除现有卡”和“充值卡”——服务器连接到支付处理器本身。

于 2010-03-24T11:23:42.000 回答