我已阅读Saving credit card information in MySQL database?和Storing Credit Card Information。
我知道存储信用卡信息需要PCI合规性,这不是一件容易的事。
这不是这个问题的关键所在。我的问题如下:
加密用户信用卡的安全方法是什么?想到的最简单和最简单的方法是使用私钥并使用它加密CC。这似乎不太安全,因为密钥必须存储在服务器上,如果攻击者可以获取我的数据库,他们也可能获得密钥。
我希望能够做的是使用该用户密码加密每个CC作为加密过程的一部分。如果有人获得数据库,他们无法解密任何东西,因为密码存储为盐渍哈希。这对于交易购买非常有用 - 用户点击“购买”,输入密码作为确认,我解密他们的CC并收取费用。他们的密码仅在请求期间在内存中,并且永远不会写入磁盘。
不幸的是,这对我正在尝试构建的内容无效 - 这项服务会收取经常性费用(例如,每月一次),无论用户是否在我需要收费时登录
鉴于这种情况,是否有一种存储用户CC的安全方式?
答案 0 :(得分:5)
由于您需要能够解密,因此加密密钥总是有可能泄漏,您将失去一切。因此,您永远不会获得绝对安全性,但是您可以让攻击者更难获取数据。
除了你,你真的可以判断你应该拥有多大程度的安全(或默默无闻)。这很可能是数据库大小,可见性等的函数。
对于泄密,不幸的是你不得不假设一切都在泄漏,迟早(例如,对弱密码进行蛮力攻击),当他们离开时你没有获得太多。
考虑到最后一次信用卡泄密丑闻 - 最糟糕的是用普通信用卡号码保存了3位数(CVV)号码,信用卡公司明确禁止(这就是为什么你总是不得不再给它一次)如果有人将您的信用卡信息存档)
如果您不想承担持有和处理此类数据的责任,那么最好的方法是使用外部支付服务 - 让他们进行处理并向您断言付款已处理完毕。您必须为他们的服务付费,但您还必须为实施自己的解决方案和承担风险付费。
答案 1 :(得分:3)
如果您使用密码作为CC加密的salt,它将是一种非常有效的信息保护方式,但是,他们永远无法更改密码......如果更改了密码,则加密数据丢失。保护加密密钥的底线是尽可能难以找到...基本上你用来隐藏密钥的步骤越多,他们找到它就越难......这意味着它更难你可以使用它并为它编程。目前没有灵丹妙药来保护一切。 (发明一种保密的安全方法,你会变得富有)
对于CVV号码,它不能如前所述存储。对于每笔交易,cc处理公司将向商家提供参考编号,然后在每次重复付款中使用参考编号。这意味着如果原始交易需要CVV号码,那么逻辑将指示定期付款也将由在第一笔交易中投入的同一用户授权。因此,重复发生的付款不需要CVV维持相同的安全级别。
答案 2 :(得分:0)
您需要对卡信息进行可逆加密。解密信息必须来自某个地方。您已经说过数据不能来自用户,并且您不希望它存储在服务器上,因此它必须位于可能更安全的单独设备上。如果您有能力回忆这些信息,那么攻击者也会破坏您的系统。因此,大概在解密期间不会在易受攻击的主机上检索解密信息。
也许考虑一个可以加密和发送信息的第三方服务,也许是专门从事PCI合规性的服务。当您第二次发送信用卡信息并收取费用时,它可能能够解密信用卡信息,或者它可能实际存储卡信息供以后使用。它甚至可能为您执行重复交易。
http://www.authorize.net/solutions/merchantsolutions/merchantservices/automatedrecurringbilling/
我刚用Google搜索,我不推荐它们。但这是一个例子。
答案 3 :(得分:0)
您实际上可以使用多个服务器。使用密钥加密cc,但将该密钥保存在单独的加密服务器上,只能通过Windows的主用户名和密码或您正在使用的任何操作系统访问。通过这种方式,您可以保护密钥,在encyrption服务上设置服务以通过加密运行卡,然后将其提交到数据库。
答案 4 :(得分:0)
当用户进行购买时使用php的私有/公共openssl函数,您使用内存中的数据进行购买,然后使用公钥存储信息进行加密。
要每月处理结算,您可以使用可以手动打孔或存储在代码中的私钥解密数据。如果你想将ssl密钥存储在代码中而不必记住它或每次都得到它。我会使用存储在配置变量中的salt加密密钥+购买yubi密钥并生成一个32个字符的密码+我自己的密码。将yubikey存放在安全的地方(安全的哈哈)。当您需要处理信用卡时,请使用在后台运行的脚本并立即运行所有计费。要更改密码,您需要解密所有卡并使用新的私钥/公钥重新加密,或者您可以解密并重新加密私钥ssl。
魔术:)
答案 5 :(得分:0)
两次加密CC信息。首先,根据用户的密码(+盐)加密信用卡数据。然后使用服务器密钥加密输出。
要访问该信息,您需要用户的密码(即使用服务器密钥解密,然后根据密码解密)。如果数据库和服务器密钥被泄露,则信息仍然不会暴露,而不会先攻击用户的密码。
用户密码用于内部加密非常重要 - 这允许您在更改服务器加密密钥时重新加密。
当用户更改密码时,您还会重新加密数据。如果用户重置密码,则应删除CC信息(无论如何都会丢失,因为它不能被加密)。