Hash 防止重复使用信用卡的最佳方法

Hash 防止重复使用信用卡的最佳方法,hash,cryptography,credit-card,Hash,Cryptography,Credit Card,我们有一个系统,我们想防止相同的信用卡号码被注册为两个不同的帐户。由于我们不在内部存储信用卡号-仅存储最后四位数字和到期日期-我们无法简单地比较信用卡号和到期日期 我们目前的想法是在信用卡注册时在我们的信用卡信息系统中存储一个散列(SHA-1),并比较散列以确定以前是否使用过卡 通常,salt用于避免字典攻击。我假设我们在这种情况下很容易受到攻击,所以我们可能应该在散列中存储盐 你们看到这个方法有什么缺陷吗?这是解决这个问题的标准方法吗?是的,在这种情况下比较散列应该可以很好地工作。盐渍散列应该

我们有一个系统,我们想防止相同的信用卡号码被注册为两个不同的帐户。由于我们不在内部存储信用卡号-仅存储最后四位数字和到期日期-我们无法简单地比较信用卡号和到期日期

我们目前的想法是在信用卡注册时在我们的信用卡信息系统中存储一个散列(SHA-1),并比较散列以确定以前是否使用过卡

通常,salt用于避免字典攻击。我假设我们在这种情况下很容易受到攻击,所以我们可能应该在散列中存储盐


你们看到这个方法有什么缺陷吗?这是解决这个问题的标准方法吗?

是的,在这种情况下比较散列应该可以很好地工作。

盐渍散列应该可以很好地工作。每个用户拥有一个salt系统应该是非常安全的。

比较哈希是一个很好的解决方案。不过,要确保你不只是在所有信用卡号码上加上相同的盐。在每张卡上使用不同的盐(如有效期)。这将使您不受字典攻击的影响

发件人:

为存储的每个密码添加一个长的、唯一的随机salt。salt(或者nonce,如果您愿意的话)的目的是使每个密码都是唯一的,并且足够长,以使暴力攻击浪费时间。因此,用户的密码不是存储为“myspace1”的散列,而是存储为随机unicode字符串+myspace1的128个字符的散列。你现在对彩虹桌攻击完全免疫


几乎是个好主意。

只存储散列是个好主意,它在密码世界中已经使用了几十年

添加盐似乎是一个公平的想法,而且确实会使攻击者更难进行暴力攻击。但是,当你实际检查以确保一个新的CC是唯一的时,这种盐将花费你很多额外的努力:你必须SHA-1你的新CC编号N次,其中N是你已经使用的盐的数量,你正在与之进行比较的所有CC。如果你真的选择了好的随机盐,你将不得不对你系统中的每一张卡进行哈希运算。所以现在是你在用蛮力。所以我认为这不是一个可伸缩的解决方案

你看,在密码世界中,salt不会增加任何成本,因为我们只想知道明文+salt是否会散列到我们为这个特定用户存储的内容中。你的要求其实很不一样


你得自己权衡一下这笔交易。添加salt并不能保证数据库的安全,如果它真的被偷了,只会让解码变得更困难。有多难?如果它将攻击时间从30秒改为一天,你将一无所获——它仍将被解码。如果它把它从一天改为30年,那么你已经取得了一些值得考虑的成就。

SHA1是。当然,关于什么是好的替代品的信息并不多。SHA2?

如果您将卡号的最后4位数字与持卡人的姓名(或仅仅是姓氏)和到期日期组合在一起,您应该有足够的信息使记录具有唯一性。散列对于安全性来说很好,但是您不需要存储/调用salt来复制散列以进行重复检查吗

我认为如上所述,一个好的解决方案是存储一个散列值,比如卡号、到期日期和姓名。这样你仍然可以进行快速比较…

@Cory R.King

SHA 1本身并没有损坏。本文展示的是,可以在不到暴力时间内生成两个具有相同哈希值的字符串。您仍然无法在合理的时间内生成等同于特定哈希的字符串。这两者之间有很大的区别

Sha1在这里不是问题。 所有这些都意味着计算碰撞(2个数据集具有相同的sha1)比您预期的更容易。 基于sha1接受任意文件可能会出现问题,但与内部哈希应用程序无关。

表示可以使用强单向哈希存储PAN(信用卡号)。他们甚至不需要加盐。也就是说,你应该给它加上一个独特的每张卡的价值。有效期是一个良好的开端,但可能有点太短。您可以从卡中添加其他信息,例如发卡机构。您不应使用CVV/安全号码,因为您不允许存储该号码。如果您使用到期日,那么当持卡人获得相同号码的新卡时,它将被视为不同的卡。这可能是好事,也可能是坏事,这取决于您的需求

使数据更安全的一种方法是使每个操作的计算成本更高。例如,如果您两次md5,攻击者破解代码的时间将更长


生成有效的信用卡号并尝试对每个可能的到期日进行收费是相当简单的。然而,它在计算上是昂贵的。如果你让破解散列变得更昂贵,那么任何人都不值得费心;即使他们有盐、散列和你使用的方法。

我认为,人们对这个的设计考虑得太多了。使用salt,高度安全(例如“计算昂贵”)散列,如sha-256,每个记录使用唯一的salt

你应该先做一个低成本、高精度的检查,然后只有在检查成功时才做高成本的最终检查

步骤1:

查找最后4位数字的匹配项(可能还有exp.date,尽管其中有一些微妙之处可能需要解决)

步骤2:

如果简单检查成功,使用salt,获取散列值,进行深入检查

cc#的最后4位是最独特的(部分原因是它包括LUHN检查d)