当然,一些散列是一个坏主意——要么是因为它的安全性低,有一些拦截,要么是因为彩虹表很常用。这并不意味着所有散列都是一个坏主意 - 交叉引用的唯一方法将是某种唯一且可预测地识别信息的方法。除非 PCI 明确禁止它 - 散列仍然是要走的路。
盐
确保你给你的哈希加盐——这可以防止彩虹攻击,或者至少需要彩虹攻击者建立一个考虑到你的盐的表。特别是如果您可以使盐保持合理的安全{我之所以说是合理的,是因为要生成盐,您需要拥有盐,这意味着它将在某处的代码中}。
选择一个好的算法
虽然 MD5 现在臭名昭著,并以各种语言实现,但它也很常见,您可以找到预制的彩虹表。生成哈希也非常快。您的系统可能可以容忍少量延迟,并使用更多处理器密集型哈希。这使得生成彩虹表的成本更加昂贵。以Tiger 算法为例。
多次散列
如果您有多个相关数据点,则多个哈希将使进行彩虹攻击变得更加困难。例如: Hash(Hash(Card#+salt1)+expireDate+salt2) - 需要知道卡号和生成日期(对您来说很容易),但不容易逆向工程(每张卡都需要彩虹) # * 每个有用的过期日期 + 两种盐的知识)。
编辑:(您的评论)
相当安全:仅通过加密连接(SFTP、SSH)传输它,不要以未加密的方式存储它 - 包括实时/迭代和备份副本,将带有盐的文件保存在网络树之外(不能直接访问/意外释放),确保对文件的权限尽可能严格(不允许组/全局文件访问)。
将随机值扔进散列的动态盐对于减少彩虹攻击非常有用——你将随机部分与散列值一起存储在表中——现在在构建彩虹时,你必须为每个动态盐构建一个彩虹。但是,根据您的需要,您不能这样做 - 您需要知道第二次创建哈希时要使用的正确随机盐(否则您将永远不会在第二次使用卡时得到拦截)......为此可预测/可重复然后您必须将动态盐基于数字的某些部分......这实际上是与另一个数据点的多重散列所做的。您拥有的数据点越多,您可以在这个方向上散列越多 - 例如,如果您有 CVV(3 个散列),或者您一次散列 8 个数字(总共 3 个散列:)hash(hash(hash(1..8+salt1)+9..16+salt2)+expDate+salt3)
。
Best Hash它是一个移动的目标,但在 security.stackexchange 上有一个很好的讨论。这指向 SHA-512。