为什么 BCrypt 比仅在数据库中存储盐和加密密码更安全?

Why is BCrypt more secure than just storing a salt and an encrypted password in the database?

我正在阅读这篇文章,BCrypt 似乎是:

所以哈希看起来像这样:

hashed = hashpw(plaintext_password, gensalt(log_rounds=13))
print hashed
'a$ZyprE5MRw2Q3WpNOGZWGbeG7ADUre1Q8QO.uUUtcbqloU0yvzavOm'

但如果那是存储在数据库中的内容,如果数据库被黑了,我们不是仍然容易受到攻击吗? BCrypt 哈希包含盐和编码后的密码,那么为什么这比仅将盐和密码存储在数据库中更好(文章称之为糟糕的解决方案 #4)?

主要区别是否在于 BCrypt 的散列机制速度慢,这使得 BCrypt 一长串常用密码既困难又昂贵?

您不能只对密码进行哈希处理,否则容易受到字典攻击;因此,您在对密码进行哈希处理之前加盐;这就是 BCrypt 所做的。

密码盐可以是public,但是每个密码都必须是唯一的。它们的目的是防止对哈希的字典攻击(因此您无法查看与密码相对应的预制哈希列表)。

和PBKDF2一样,Bcrypt是自适应函数;随着更多计算能力的出现,您可以稍后增加迭代,使散列不易受到暴力攻击。尽管如此,Bcrypt 在 GPU 上比 PBKDF2 更难加速。