Cryptography 确定重复信用卡号而不存储它们的最佳方法是什么?

Cryptography 确定重复信用卡号而不存储它们的最佳方法是什么?,cryptography,passwords,md5,credit-card,Cryptography,Passwords,Md5,Credit Card,我经营一个网站,在那里我们将某些账户标记为骗子,并“标记”他们的账户和所有被用作坏信用卡的信用卡。我们不存储实际的信用卡值,而是存储它的校验和/MD5算法 我们现在一直在碰撞。存储这些值的最佳方式是什么?不可逆,但能够对未来值进行比较 我认为MD5是最好的,但我们在这里有一个争论…使用SHA1,哈希冲突尚未被发现。如果您发现与MD5的冲突,为什么不使用更好的算法,例如?加密安全的哈希会起作用。(SHA512或SHA256可以) 然而,我会使用一个相当秘密的salt,它不会与卡一起存储(以防止任何

我经营一个网站,在那里我们将某些账户标记为骗子,并“标记”他们的账户和所有被用作坏信用卡的信用卡。我们不存储实际的信用卡值,而是存储它的校验和/MD5算法

我们现在一直在碰撞。存储这些值的最佳方式是什么?不可逆,但能够对未来值进行比较


我认为MD5是最好的,但我们在这里有一个争论…

使用SHA1,哈希冲突尚未被发现。

如果您发现与MD5的冲突,为什么不使用更好的算法,例如?

加密安全的哈希会起作用。(SHA512或SHA256可以)

然而,我会使用一个相当秘密的salt,它不会与卡一起存储(以防止任何形式的彩虹表攻击)

PS:
针对信用卡的彩虹表攻击可能特别有效,因为由于有限的字符集、固定大小和校验数字,纯文本空间的总大小非常小

PPS:

您不能对每个条目使用随机salt,因为您永远无法切实检查重复项。盐是用来防止碰撞的,而在这种情况下,我们专门寻找碰撞。

MD5不是解决办法,因为它已经坏了。引用Bruce Schneier的话:“我们已经知道MD5是一个坏掉的哈希函数”,并且“不应该再使用MD5了。”


也就是说,使用SHA512或SHA256,就像某人已经提议的那样。

使用尽可能强的散列通常是好的。速度并不是最重要的,而慢实际上对任何试图用蛮力反转散列值的人都是不利的

我个人喜欢惠而浦——如果您使用的是PHP,请访问


Whirlpool返回128个字符长的字符串,但您不必存储所有字符串。前32或64个字符就足够了。你也可以考虑Sh512或Sha28。

< P>使用一个好的散列算法是不够安全的。如果您的列表被盗,您存储的哈希可用于检索工作卡信息。信用卡号的实际模式空间足够小,因此确定的攻击者也可以提前计算许多可能的哈希值,如果存在入侵或内部作业,这可能会对系统产生其他影响

我建议您使用salt,并根据涉及卡号的每个数字和第一个salt值的公式计算要添加到salt中的第二个值。这确保了如果您失去了对任一部分的控制,您仍然具有合理的唯一性,这使得列表的所有权变得毫无用处。但是,公式不应在卡片的前6位(仓位号)上有很大的权重,并且公式的任何痕迹都不应与salt或最终散列存储在同一位置

考虑对16位信用卡号码的剖析:

6位BIN(银行识别号)
9位帐号
1位Luhn校验和

银行标识代码列表在加工业中广为人知,对于那些能够获得非法卡号列表的人来说,收集这些列表并不太困难。为每个发卡机构分配的空间将进一步减少有效BIN的数量

Visa卡-以4开头
美国运通-以34/37开头
万事达卡-以5开头
发现/杯-从6开始
食客俱乐部-从35开始
等等

请注意,每个发卡机构类别中分配的某些银行标识代码信息也是稀疏的。如果攻击者知道您的大多数客户所在的位置,那么这将大大降低唯一性,因为BIN信息是按银行分配的。一个已经拥有富裕社区一家小银行发行的账户的攻击者可以获得一个账户,并将该银行标识代码作为自己卡的起点

校验和数字是用一个众所周知的公式计算出来的,因此它可以作为唯一数据源立即丢弃

有了几个值得攻击的箱子,攻击者每次必须检查每个箱子集的9位数字。这是每套10亿个校验和和哈希运算。我手头没有任何基准测试,但我非常确定,在功能强大的机器上,每分钟100万次哈希操作对于MD5或任何类型的SHA来说都不是不合理的。这相当于不到一天就可以破解给定垃圾箱下的所有火柴

<>最后,您可以考虑用哈希存储一个时间戳或访问者令牌(IP /子网)。抓取重复的卡号是很好的,但也要考虑有人用伪造的卡号填充系统的后果。在某个时刻,你需要在你知道无效的阻止卡号之间做出权衡,同时也给自己一个识别和修复误用的机制


例如,一个不满的员工可能会自己窃取卡片信息,然后使用你的散列机制,通过在你的卡号黑名单中插入有效的散列来阻止重复业务。如果您只是存储一个散列,那么撤销此操作的成本相当高——一旦将其转换为散列,所有内容都是不透明的。记住这一点,给自己一个方法来识别散列的来源。

也许你可以存储两个不同的卡号散列。两种散列都会导致冲突的可能性几乎为零。

不用费心做盐,只要使用HMAC即可。我知道这是一种滥用,但是你会得到一个像样的密钥散列,这样你就可以防止冲突和彩虹表攻击

这里的好处是,即使密钥泄漏,也没有人能够解密它。对HMACs来说,最有效的方法就是暴力。实际上,这里的关键是前面提到的盐。这里的好东西