我在PHP中使用bcrypt查看哈希和salting密码。 有人可以向我解释为什么 brcypt使用“工作”/“轮次”可以防止攻击?
我已经读过“How do you use bcrypt for hashing passwords in PHP?”了,但是如果有人抓住你的数据库并将其破解,我很难理解是什么让它如此特别?
是否可能由salt和hash共同保护数据库免受彩虹表的影响?或者bcrypt是否做了一些特别的事情来帮助防止像这样的攻击?
答案 0 :(得分:4)
简单地说bcrypt
比其他散列算法(如sha
系列“更好”,因为它特意慢,并且可以通过使用高迭代计数使其特意慢。此外,它需要使用盐来防止使用预先计算的哈希值(彩虹表)。 salt值应与bcrypt的每个输出一起生成/存储,以禁止不同用户的值之间的比较(如果他们使用相同的密码)。
即使攻击者获得了密码哈希值和盐,只要您使用bcrypt
使用大量迭代,就无法快速找到匹配的密码。它是单向函数,因此您需要为尝试的每个密码执行一次bcrypt计算。这当然不能防止错误的密码。
答案 1 :(得分:1)
简而言之,bcrypt和其他密码拉伸算法都是关于工作放大的。攻击者必须做更多的工作来破解密码(因为你通常只能以低得多的速率获得有效的登录请求或错误的密码);因此,每增加一个毫秒的密码哈希时间,攻击者必须支付一百万或十亿倍。 Bcrypt和其他算法只会故意降低速度,使攻击者花费更多时间来破解密码。