【问题标题】:Is there a secure way to guarantee credit card uniqueness?有没有一种安全的方式来保证信用卡的唯一性?
【发布时间】:2011-06-24 12:46:12
【问题描述】:

因此,就像任何有能力的 Web 开发商店一样,我们在接触信用卡时戴上棉手套,并使用 Braintree SecureVault 来存储它们,这样我们就不会遇到 PCI 合规性问题。

但是,现在我们希望为我们的服务提供免费试用,这在很大程度上依赖于能够保证给定信用卡仅用于免费试用一次。理想情况下,我们将能够对信用卡号本身进行哈希处理以保证唯一性。问题在于有效信用卡号码的集合很小,因此很容易暴力破解信用卡号码。就我所见,加盐策略是没有用的,因为如果有人可以访问哈希数据库,他们很可能也有代码,因此也有加盐算法。

迄今为止最好的两个想法是:

A) 将哈希值隔离在一组中,与其计费信息无关。因此,如果哈希是暴力破解的,那么它们所拥有的只是一个在某个时间点使用过的信用卡号码列表,没有个人信息,也不知道它是否仍然有效。这里的主要弱点是我们确实有 last-4 的记录,这可能会在某种程度上用于匹配它们。

B) 没有全数的散列并处理误报和误报。名称、last-4 和过期时间的散列应该是相当独特的。误报就像中了彩票,我们可以在客户支持处处理。修改名称可能会导致漏报,我们不清楚我们对名称匹配的准确性有什么保证(我的理解可能受到网关和商家帐户的影响),因此这可能会打开一个漏洞。

想法?建议?久经考验的智慧?

【问题讨论】:

  • 为什么您不能也使用 Brainfree Secure Vault 来进行试用?
  • 不保证唯一性,即多个帐户可以使用同一张信用卡,从业务角度来看,这基本上是整个想法的下沉,因为我们有真正的负债。虽然这对于他们的 API 来说肯定是一项有趣的服务。

标签: hash credit-card pci-dss


【解决方案1】:

高级别的:使用现有的支付系统
我认为这种方法——使用信用卡号码来确定用户是否已经利用了免费试用并且应该没有资格获得随后的免费试用——是错误的。首先,您会通过预先要求信用卡(许多用户除非他们真正准备好购买时不会提供信用卡)来赶走潜在客户,而不是在试用期结束后才要求。

其次,您正在重新发明轮子。有大量的“应用商店”(Chrome 网上商店、Android 市场、iTunes 应用商店等)提供内置的付款和试用期机制。使用这些系统将提高您的产品对消费者的可见度,为您的潜在客户提供多种不同的支付方式(使他们更倾向于购买),并且还可以省去您自己实施这种机制的麻烦。此外,用户通常更愿意将信用卡发放给尽可能少的公司;您不仅需要自己实现这种复杂的机制,而且还必须让用户足够信任您以使用它。

低级:实施细节
任何哈希机制都可能有冲突,因此您仍然需要处理这个问题。您显然应该对服务器使用全盘加密和其他最佳安全实践。通过将后端数据库服务托管在与托管此代码的计算机不同的计算机上,可以降低数据库和加盐算法同时受到损害的风险。哈希的主要漏洞是蛮力攻击。处理它们的最好方法就是让暴力破解变得足够昂贵,以至于不值得攻击者花时间。为每个条目使用单独的盐(例如,客户的姓名、客户的邮政编码等作为盐的一部分)将使使用彩虹表无效。当然,使数据本身对攻击者的价值降低(例如,不包括完整的信用卡号)也是阻止此类攻击的好方法。无论如何,我再次建议您利用许多应用商店,而不是自己实施。

【讨论】:

  • 你在高级别的位上有点太自以为是了。您对业务一无所知,因此您实际上是凭空提出来的。如果没有信用卡,我们不能保证人们不会注册多次试用,如果他们注册了多次试用,那么我们将面临无限的不利影响。我不是坐在车库里。我们已经拥有数百万用户和数千名订阅者,并以 12 种货币进行支付。
  • 我喜欢将哈希数据库托管在单独的强化服务器上​​的想法,该服务器仅接受 API 请求进行单个哈希查找,不过,谢谢。
【解决方案2】:

如果我遗漏了什么,请原谅我,但是为什么你不能只拥有一个只有一列的“UsedCreditCards”表,它是信用卡号的 SHA512 哈希值,可能还有到期日期。这是无法逆转的,通过将其保存在另一个表中并且不存储有关代码的任何其他数据,您可以轻松地检查信用卡号是否曾被使用过。

我不确定这是否会违反 PCI 或其他任何规定(我不这么认为,但我可能是错的)

【讨论】:

  • 它无法逆转,但很容易被暴力破解(尝试所有信用卡和未来两三年内到期日期的组合,对它们进行哈希处理,看看它们会发生什么冲突和)。如果他们保留了将信用卡号的某些数字与其他信息相关联的记录,那么仍然有可能获得完整的信用卡号以及相关的个人信息。
  • @Michael - 所以,他们必须找到正确的 16 位信用卡号,然后是正确的到期日期,然后他们才能知道“这张信用卡已注册之前的一条小径”。我不明白这是一个问题? ...或者一个人会如何处理这些信息。
  • @webdestroya,不,然后他们会根据信用卡号查找个人信息,现在他们有一个可以用来收费的信用卡号。
  • @webdestroya,我想那里有彩虹表可以非常快地发现普通信用卡号码的冲突。
  • @webdestroya - 你应该复习你的加密基础知识。有两个有效的信用卡号 + exp 日期字符串哈希到相同值的可能性非常小。有效信用卡加上合理的到期日期的集合非常小,因此暴力破解实际上与撤销相同,需要少量的计算能力。正确的加盐算法可能会稍微缓解,但对于这么小的一组来说,这是一场艰苦的战斗。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2015-09-13
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多