存储信用卡号的加盐哈希而不是数字本身以进行安全查找非常容易。对于 99% 的场景,这将是足够的信用卡存储 - 快速且非常安全。
如果您确实需要在某些情况下对信用卡进行可逆加密(例如,继续计费),我会使用存储在数据库以外的安全位置的对称密钥。自从我查看 PCI 规格以来已经有一段时间了,但我相当确定这是符合 PCI 标准的。
如果您需要快速查找和可逆加密,请使用两个选项:哈希和加密。
编辑:
我的回答似乎存在一些争议。我想指出以下来自 Integrity.com 的非常有趣的文章 (PDF):
散列信用卡号码:不安全的应用程序做法
它详细说明了存储信用卡数据哈希所涉及的许多问题,但其结论证实了我的建议。
是的,卡的原始哈希是不安全的;这就是我们为哈希加盐的原因!但是静态盐也不安全,它们允许为已知的静态盐创建彩虹表。所以最好让我们的盐以某种不可预测的方式变化。在密码的情况下,对每个被检查的密码使用单独的随机散列就足够了;它甚至可以与散列密码位于同一个表/行中。对于信用卡,这应该是相同的——每个信用卡实例的随机盐被散列。如果信用卡号在每笔交易中存储,则为每笔交易单独存储一个盐。
这种方法有利有弊,但它足够安全。优点是缺乏密钥管理;盐和哈希就在那里,不需要更改,同时仍然允许对哈希进行审计检查;例如,该信用卡哈希是否与该已知信用卡号匹配?
缺点正在搜索中;不可能在许多交易中有效地搜索特定的信用卡号。
当然,无论如何,您都会遇到外部加密的问题。除非数据库本身是加密的(只有某些数据库支持),否则您将无法很好地搜索。即便如此,在数据库甚至表级别进行加密也会显着降低搜索效率。