所以我想修改一个 PHP / MySQL 应用程序,以便安全地存储信用卡而不是 cvv 和银行帐户信息。PCI DSS 需要 1024 RSA/DSA。少数用户将获得私钥,以解密帐户信息的批处理文件,每月提交给支付处理器。我不清楚是否有可能拥有一个允许使用普通 8 位密码登录的用户安全地修改自己的帐户信息的系统。似乎这是不可能的,并且加密应该是单向的(即每个用户-> 管理员;永远不允许用户再次解密他们自己的信息),即使通过 SSL 连接,帐户信息也永远不会暴露给用户。或者是否有一种适当且简单的方法可以做到这一点,我不知道它是否符合 PCI DSS?
2 回答
PCI DSS 不需要 1024 位 RSA 进行加密。旧版本的规范按名称提到了 AES 和 3DES,但我相信新版本只是指定了强加密。大多数人都在使用 AES 256。
使用非对称算法加密静态数据实际上并不奏效。对称算法效果最好。这允许应用程序在需要时访问卡数据。这并不意味着您必须再次向用户显示数据,它只是意味着当您需要获取数据时数据就在那里。如果您要存储信用卡授权信息,通常需要卡号进行结算。(这实际上取决于您的处理器具有的功能。一些小型企业级处理器为您存储卡,但这对于像 Paymentech 和 FDMS 这样的大型处理器是不可行的。)
问题是您必须定期轮换加密密钥。这通常是把每个人都搞砸的原因。如果您使用自己的加密,则需要确保您可以指定 n 个密钥,只要有使用这些密钥加密的数据即可访问。在任何时间点,只能使用其中一个密钥进行加密。除非您对 PCI 方面的加密和密钥管理有深入的了解,否则您可能希望使用商业产品。是的,这些很昂贵,但您必须通过构建或购买决策过程来确定最佳课程。
Ingrian(现为 SafeNet)为网络 HSM 提供了不错的产品。它将为您管理密钥并执行加密操作。也可以使用他们的数据库级加密集成,这样您根本不必更改您的应用程序。(尽管我认为 DB 级加密的安全性值得怀疑。)
这是一个非常深奥的主题;我在 PCI 上做了很多工作,并建议您聘请某人来指导您正确地进行操作。您将在错误启动和重做工作上花费大量资金,因此请尽早让审计员参与进来,至少评估您需要什么并告诉您如何正确实施安全性。
如果您区分数据存储、访问和传输,您可能会更轻松。
存储需要强大的可逆加密;除非您可以检索数据,否则数据没有用处。
访问要求用户或进程在被允许解密数据之前对其自身进行身份验证。这是一个可以实现此目的的机制示例:
- 使用永远不会直接向任何用户公开的密钥存储数据。当然,您需要将该密钥存储在某个地方,并且您必须能够检索它。
- 当每个用户选择密码时,使用密码为该用户加密私钥的个人副本。(注意:即使您正在加密密钥的每个副本,维护相同信息的多个副本也可能会出现安全问题。)
- 不要存储用户的密码。相反,根据标准最佳实践(使用盐等)对其进行散列并存储散列。
- 当用户提供登录密码时,将其散列并与您存储的值进行比较。如果它们匹配,则使用(明文)密码解密密钥,然后使用该密钥解密实际数据。
通过安全连接(例如 SSL)传输数据。只要您继续遵循最佳实践,允许用户访问(和修改)他们自己的数据是合理的(也许是必需的)。
注释:
8 位密码意味着 10 8 ~ 2 27 = 27 位的密钥空间,按照今天的标准,这是相当糟糕的。如果您不能鼓励使用更长(或字母数字)的密码,您可能需要考虑其他层。
多层策略(用户提供用于加密“实际”密钥的密码)的一个优点是您可以对用户透明地更改加密密钥,从而满足任何密钥轮换要求。
每当您设计安全解决方案时,标准的警告是要记住,即使遵循标准,DIY 安全也是有风险的。您最好使用信誉良好的供应商提供的现成软件包,或者至少让经过培训的、经过认证的安全专业人士对您的策略和实施进行审计。
祝你好运!