Ruby on rails 3 防止使用同一张信用卡多次购物?

Ruby on rails 3 防止使用同一张信用卡多次购物?,ruby-on-rails-3,authorize.net,activemerchant,pci-compliance,Ruby On Rails 3,Authorize.net,Activemerchant,Pci Compliance,我正在考虑如何在我的Rails应用程序上开发一个验证程序,该程序主要检查以确保任何用户用于任何给定交易的信用卡在我们的系统中都是唯一的,这样所有的信用卡都可以在整个应用程序中为所有用户购买一件物品一次 这种限制背后的想法是,该应用程序有时会运行对时间敏感的促销交易,我们希望尽最大努力为这些交易建立“一张信用卡一次购买”系统 我想对信用卡号进行散列,然后将散列存储在数据库中,然后在每次新购买时交叉引用它(因此我的支付网关保留了实际的数字,而我只在数据库中保留了一个散列),但是 所以我回到了画板上,

我正在考虑如何在我的Rails应用程序上开发一个验证程序,该程序主要检查以确保任何用户用于任何给定交易的信用卡在我们的系统中都是唯一的,这样所有的信用卡都可以在整个应用程序中为所有用户购买一件物品一次

这种限制背后的想法是,该应用程序有时会运行对时间敏感的促销交易,我们希望尽最大努力为这些交易建立“一张信用卡一次购买”系统

我想对信用卡号进行散列,然后将散列存储在数据库中,然后在每次新购买时交叉引用它(因此我的支付网关保留了实际的数字,而我只在数据库中保留了一个散列),但是

所以我回到了画板上,寻找新的想法。有谁知道解决这个问题的好方法,同时尽我所能保持PCI兼容


我正在使用Rails 3进行开发,并使用ActiveMerchant与我的支付网关Authorize.net集成,如果有帮助的话。

如果您希望“每个用户一次购买”那么,当用户试图购买特殊的购买物品时,为什么不检查用户的购买历史,以确保他们以前没有购买过该物品?

用户可以注册多个帐户

尽管通过检查用户历史记录,以及在每次购买时每个地址强制执行1项,您可能会没事,但您也可以通过用户名/生日/任何其他标识信息来限制内容


信用卡信息也可以改变的方式-它实际上很容易购买100礼品信用卡与唯一的号码,所以如果你想警察的事情下降到最分钟的水平。。。我不认为你能仅仅通过cc数字就知道,当然一些散列是个坏主意——要么是因为它的安全性低,有一些截获,要么是因为彩虹表很常用。这并不意味着所有的散列都是一个坏主意——交叉引用的唯一方法是以某种方式唯一且可预测地识别信息。除非PCI明确禁止,否则哈希仍然是一条路要走

确保你给你的散列加盐-这可以防止彩虹攻击,或者至少需要彩虹攻击者在建立一个表时考虑到你的盐。特别是如果你能合理地保证salt的安全性{我说的是合理的,因为为了生成salt,你需要salt,这意味着它将在某个地方的代码中}

选择一个好的算法

虽然MD5现在声名狼藉,并用各种语言实现,但它也非常常见,以至于您可以找到预先制作的rainbow表。生成散列的速度也非常快。您的系统可能可以容忍少量延迟,并使用处理器密集度更高的哈希。这使得生成彩虹表的成本更加昂贵。例如,查看下面的示例

多次散列

如果您有多个相关的数据点,多个散列将使彩虹攻击更加困难。例如:哈希(Hash(Hash(Card#+salt1)+expireDate+salt2)-需要知道卡片和生成日期(对您来说很容易),但不容易进行反向工程(rainbow要求每张卡片#*每个有用的过期日期+两种盐的知识)

编辑:(您的评论)

合理安全:仅通过加密连接(SFTP、SSH)传输,不要存储未加密的文件(包括实时/迭代和备份副本),将文件和salt放在web树之外(不能直接访问/意外释放),确保文件权限尽可能严格(不允许组/全局文件访问)

动态盐向散列中抛出随机值对于减少rainbow攻击非常有用-您将随机块与散列值一起存储在表中-现在在构建rainbow时,您必须为每个动态盐构建一个。但是出于您的需要,您不能这样做-您需要知道正确的随机盐,以便在第二次创建时使用散列(否则,在第二次使用卡时,您将永远不会得到截获)…为了实现可预测性/可重复性,您必须将动态salt基于数字的某个部分…这实际上就是使用另一个数据点进行多次散列所做的。您拥有的数据点越多,可以朝这个方向散列的数据就越多-例如,如果您拥有CVV(3个散列),或者一次散列8个数字(对于总共3个散列:
hash(散列(散列(1..8+salt1)+9..16+salt2)+expDate+salt3)


最好的散列这是一个移动目标,但有一个很好的。它指向SHA-512。

我认为你看错了方向。我只会检查卡、ip和装运地址的最后4个。如果有少数用户使用最后4个ip解决方案,那么存储该数据的风险与损坏的风险是不值得的。(他说不知道购买的性质。)


由于未收集地址…前4位、后4位和4位过期(当然都是散列的)应提供您所需的唯一性,以确保卡只使用过一次。

伪造您的真实身份是防止这种情况发生的最佳方法。花旗银行客户可以登录并使用所有帐户提供的此工具。只需生成一个号码和exp日期供在线使用,目前一切正常。

因为我还想确保另一个用户使用的卡与第一个用户使用的卡不同。因此,我想这更像是“每个用户购买一张信用卡”,而不是“每个用户”…礼品信用卡的好处在于,我没有想到这一点。我还记录了用户的IP地址(我知道这也可能被欺骗),但我希望IP加上散列的CC号码可能足以阻止90%的规避尝试