假设我有一个表格,其中存储了哈希密码以及密码所用的盐(对于每个用户)。
基于另一个stackoverflow问题,我明白盐可以用散列密码保存在同一个表上。
How insecure is a salted SHA1 compared to a salted SHA512
我的问题是,如果带有散列密码的数据库被黑客入侵,并且用户将拥有这些哈希的彩虹表,并且考虑到盐与散列密码一起存储在同一个表中,那么它是不是很完整很容易看到实际的密码?您只需要从特定的彩虹表中删除密码中的盐。
考虑到这一点,我不明白为什么可以将盐存储在具有哈希密码的同一数据库表中。有人可以给出更明确的解释吗?
答案 0 :(得分:7)
好的,停在那里。如果您甚至询问有关盐腌的问题,那么您已经走错了路。这是很容易出错的事情,并且有很多非常糟糕的例子说明如何做到这一点很容易对完全错误的东西过于自信。
最简单的正确方法是使用password_hash
function而不是发明自己古怪的做法。这实际上比你在这里考虑的要容易得多,也更安全。
password_hash
函数默认在内部使用Bcrypt,它是一个非常难以暴力破解的哈希,不能与彩虹表一起使用。它也是可调节的,因此如果你愿意,你可以任意地使它变得更加困难。
您需要此可调整性因子来保护您的数据库更长的时间。今天非常难以破解的十年可能是微不足道的,我们只是不知道。您现在可以更加努力,以确保如果您的数据库确实泄漏了某些时候您仍然受到保护。
将哈希和盐存储在同一个表中通常是必需的,将它们拆分通常是徒劳的,攻击者抓住两个不同的表几乎不会花费太多精力。他们可能会从你无法控制的备份中获取所有内容。
现代的破解系统甚至不打扰彩虹表。 GPU cracking is so insanely fast中的最新技术使它变得毫无意义,常见的密码可以在几秒钟内破解,在几分钟内就可以破解,而在几小时或几天内更加模糊,如果这甚至是优先考虑的话。比特币对SHA256的使用推动了该部门的大量研究,使得这些算法在这种安全性方面几乎无用。市场上有些设备每秒可以执行数万亿次的哈希值。
这实际上比从硬盘读取彩虹表更快。彩虹桌基本上是历史。
今天的威胁是已知良好密码的巨大词典,以及将其变为更加天文数字变体的方法。这些使GPU保持忙碌,并且可以发现人们使用的许多不那么常见,故意更棘手的密码。