存储信用卡信息

时间:2009-11-19 13:01:49

标签: encryption rsa pci-dss

所以我想修改一个PHP / MySQL应用程序,以便存储信用卡,但不能安全地存储cvv和银行帐户信息。 PCI DSS需要1024个RSA / DSA。少数用户将获得私钥,以便解密帐户信息的批处理文件,以便每月提交给支付处理器。我不清楚是否有可能让系统允许已使用普通8位数密码登录的用户安全地修改自己的帐户信息。这似乎是不可能的,加密应该是单向的(即每个用户 - >管理员;永远不允许用户再次解密他们自己的信息),帐户信息甚至不会通过SSL连接暴露给用户。或者是否有一种正确而简单的方法来做到这一点,我不知道这是否符合PCI DSS?

2 个答案:

答案 0 :(得分:2)

PCI DSS不需要1024位RSA进行加密。较旧版本的规范提到了AES和3DES的名称,但我相信较新的版本只是指定了强加密。大多数人都使用AES 256。

使用非对称算法加密静态数据并不真正有效。对称算法效果最好。这允许应用程序在需要时访问卡数据。这并不意味着您必须再次向用户显示数据,这只是意味着当您需要访问数据时数据就在那里。如果您要存储信用卡授权信息,通常需要使用卡号进行结算。 (这实际上取决于您的处理器所具有的功能。一些小型企业级处理器会为您存储卡,但这对于像Paymentech和FDMS这样的大型处理器来说是不可行的。)

问题是您必须定期轮换加密密钥。这通常是每个人都搞砸了。如果您自己进行加密,则需要确保只要存在使用这些密钥加密的数据,就可以指定可访问的n个密钥。在任何时间点,只应使用其中一个密钥进行加密。除非您对PCI的加密和密钥管理有深刻的理解,否则您可能希望使用商业产品。是的,这些都很昂贵,但您必须通过构建或购买决策制定流程来确定最佳方法。

Ingrian(现在的SafeNet)为网络HSM提供了不错的服务。它将为您管理密钥并执行加密操作。也可以使用它们的DB级加密集成,这样您就不必更改应用程序了。 (虽然我认为数据库级加密是可疑的。)

这是一个非常深刻的主题;我已经做了很多关于PCI的事情,建议你雇一个人来指导你做正确的事。你会花很多钱在错误的开始和重做工作上,所以尽早让审计员参与,至少评估你的需求并告诉你如何正确实施安全。

答案 1 :(得分:2)

如果您区分数据存储访问传输,您可能会更轻松。

存储需要强大的可逆加密;除非您可以检索数据,否则数据无用。

访问要求用户或进程在允许解密数据之前对自身进行身份验证。以下是一个可以实现此目的的机制示例:

  1. 使用永远不会直接向任何用户公开的密钥存储数据。当然,您需要在某处存储 键,并且您必须能够检索它。
  2. 当每个用户选择密码时,使用密码加密该用户的私钥的个人副本。 (注意:即使您正在加密密钥的每个副本,也可能因维护相同信息的多个副本而导致安全问题。)
  3. 不要存储用户密码。相反,哈希根据标准最佳实践(使用salt,等。)并存储哈希值。
  4. 当用户提供登录密码时,请将其哈希并与存储的值进行比较。如果匹配,请使用(plainitext)密码解密密钥,然后用于解密实际数据。
  5. 通过安全连接(如SSL)传输数据。只要您继续遵循最佳实践,允许用户访问(和修改)他们自己的数据是合理的(可能是必需的)。


    评论:

    • 一个8位密码意味着密钥空间为10 8 ~2 27 = 27位,按今天的标准来说相当糟糕。如果您不能鼓励更长的(或字母数字)密码,您可能需要考虑其他图层。

    • 多层策略的一个优点(用户提供用于加密“实际”密钥的密码)是您可以透明地更改加密密钥给用户,从而满足任何密钥轮换要求..

    • 每当您设计安全解决方案时,标准的警告就是要记住,即使遵循标准,DIY安全性最多也是有风险的。您几乎总是更好地使用信誉良好的供应商提供现成的软件包,或至少经过经过培训的,经过认证的安全专业人员审核您的策略和实施。

    祝你好运!