我一直在阅读它是如何工作的,它在如何减慢暴力尝试方面真的很酷,但它仍然感觉不安全.
让我们说有人偷了我的数据库数据,包括我的所有用户密码哈希,并知道我使用password_hash来哈希我的密码.他不能用他的字典和password_verify循环访问我的密码来获取访问权限吗?
解决方法:
添加到@adeneo的答案,
bcrypt,pbkdf2,scrypt和现代密码散列策略的要点是缓慢的.
是的,如果从数据库(sqli)获得结果哈希,您只需尝试密码并尝试验证每个密码.
但是,只是尝试密码有点轻描淡写.我们来看看一些数学.
使用bcrypt的password_hash()的默认成本大约需要0.1秒来散列密码.这意味着验证密码哈希需要大约0.1秒.
英语中大约有1,000,000个单词.要尝试每一个,您需要验证1,000,000次.每秒0.1秒,即100,000秒(约27小时).
对于泄露的单个密码哈希,有1,000,000个猜测需要27个小时.由于每个哈希都带有一个salt,攻击者需要为每个泄漏的哈希重复这些猜测.
如果您的数据库有100万用户,只需要针对密码尝试字典就需要76,000个cpu年(一个cpu为76,000年,76,000个cpu为1年,或者之间的任何交易).
从正确的角度来看,25 GPU cluster上的md5()每秒可以进行大约180,000,000,000个猜测.要检查数百万字典条目与DB中的百万哈希值,它需要大约5.5秒.
137 GPU秒与76,000 cpu年.这就是使用bcrypt的原因.