如果网络用户选择了一个令人难以置信的易于猜测的密码,我想问一个关于salting有效程度的问题。我已阅读(并重新阅读)以下网页,但我觉得我的理解仍然不是100%明确。
How does password salt help against a rainbow table attack?
从上面的第二个网址中可以找到以下内容(由用户“Ross”提供):
要理解第一个,想象一个包含数百个用户名和密码的密码文件。没有盐,我可以计算“md5(attempt [0])”,然后扫描文件以查看该哈希是否出现在任何地方。如果存在盐,那么我必须计算“md5(salt [a] .Try [0])”,与条目A进行比较,然后“md5(salt [b] .Try [0])”,与条目B进行比较现在我有n倍的工作要做,其中n是文件中包含的用户名和密码的数量。
现在,我知道在表中为每条记录引入一个独特的盐会使黑客攻击密码的难度增加n倍。但是如果网络用户天真地将“密码”或“狗”或“猫”作为他的密码呢?如果我理解StackOverflow正确回答,则数据库表中每条记录的每个唯一salt都不会保密。设法破坏数据库的黑客可以很容易地使用单独的盐。由于黑客需要n个彩虹表而不是一个彩虹表,因此这些盐可以减慢黑客的速度。但是,如果Web用户拥有密码cat,并且此Web用户恰好是10000记录长表中的第一个或第二个或第三个记录,那么
$hash = sha512($salt.cat)
不会保护天真的网络用户免遭黑客入侵,不是吗?因为黑客知道盐,他可能会将盐附加或添加到一个简单的密码,他会知道哈希。然后,他将使用彩虹表,并且网络用户的数据会受到损害。我是否正确理解表中Web用户记录的位置以及Web用户所选密码的简单性,甚至可以破坏最巧妙的哈希,因为黑客可以访问盐?
答案 0 :(得分:2)
你是对的,它不会防止可怕的密码。
在配有8个AMD R9 290X显卡和hashcat的PC上,你可以破解 每秒797百万个SHA512哈希值。
这使得非常很容易根据弱密码字典检查密码。
如果您将PBKDF2与SHA512和20,000次迭代一起使用,您仍然可以每秒管理39000个哈希值,因此每个密码字典中出现的弱密码仍然存在风险。
最好强制用户不要使用标准词典中的密码。在该机器上强制使用单个7个字母的字母数字非字典密码需要17年。
让您的用户使用安全密码祝您好运。 Dilbert reference:
答案 1 :(得分:1)
给定一个散列密码数据库,可以通过以下方式解析密码:(1)获取所有可能密码的字典(2)为每个可能的密码生成散列(3)将给定数据库中的每个散列与所有散列相对照生成。
所以,cost-of-cracking-one-password = cost-of-generating-all-hashes + cost-of-matching-all-hashes
=> cost-of-cracking-1000-passwords = 1000 x cost-of-cracking-one-password
或者似乎是这样。但是,
如果没有盐,那么cost-of-generating-all-hashes
是恒定的,只需要进行一次。然后我们可以说cost-of-cracking-the-whole-database
与cost-of-cracking-one-password
大致相同。从这个形式我们看到,如果没有盐,如果黑客获得密码数据库,那么黑客肯定会破解整个数据库,而不是针对任何单一条目。通过这种方式,他肯定会得到至少一些哈希值。
Salt 以防止此行为。现在,对于包含1000个盐渍哈希的数据库cost-of-cracking-1000-passwords = 1000 x cost-of-cracking-one-password
。请注意,即便如此cost-of-cracking-one-password
仍然与之前的cost-of-generating-all-hashes + cost-of-matching-all-hashes
相同。
Salting不保护个人密码。相反,它阻止了黑客主动破解整个数据库。