我一直在读它是如何工作的,它真的很酷,它如何减缓暴力尝试,但它仍然感觉不安全。
假设有人偷了我的数据库数据,包括我所有的用户密码散列,并且知道我使用了password_hash散列我的密码。难道他不能用他的字典和password_verify循环访问我的密码以获得访问权限吗?
在散列密码之前添加另一个盐是好的做法吗?

最佳答案

加上@adeneo的回答,
bcrypt、pbkdf2、scrypt和现代密码哈希策略的重点是速度慢。
是的,如果你从数据库中得到哈希(Sql),你可以尝试密码并尝试验证每一个。
然而,仅仅尝试密码是有点轻描淡写。我们来看看数学。
使用bcrypt时password_hash()的默认开销大约需要0.1秒来散列密码。因此,这意味着验证密码哈希大约需要0.1秒。
英语中大约有一百万个单词。要尝试每一个,您需要验证1000000次。每分钟0.1秒,即100000秒(约27小时)。
27个小时1000000次猜测一个密码哈希被泄露。由于每个散列都带有一个salt,攻击者需要对每个泄漏的散列重复这些猜测。
如果你的数据库有100万用户,只需对密码进行字典测试就需要76000 CPU年(1 CPU 76000年,76000 CPU 1年,或者两者之间的任何交易)。
从这个角度看, > 可以每秒大约猜180000000000次。要对照数据库中的一百万个散列检查这一百万个字典条目,大约需要5.5秒。
137 gpu秒对76000 cpu年。这就是为什么使用bcrypt。