为什么 BCrypt 比仅在数据库中存储盐和加密密码更安全?
Why is BCrypt more secure than just storing a salt and an encrypted password in the database?
我正在阅读这篇文章,BCrypt 似乎是:
- 从密码计算哈希值很慢(好事)
- 不在数据库中存储盐,而是直接在密码中存储盐
- 使用一个 log_rounds 参数来说明计算内部哈希函数的次数。
所以哈希看起来像这样:
hashed = hashpw(plaintext_password, gensalt(log_rounds=13))
print hashed
'a$ZyprE5MRw2Q3WpNOGZWGbeG7ADUre1Q8QO.uUUtcbqloU0yvzavOm'
但如果那是存储在数据库中的内容,如果数据库被黑了,我们不是仍然容易受到攻击吗? BCrypt 哈希包含盐和编码后的密码,那么为什么这比仅将盐和密码存储在数据库中更好(文章称之为糟糕的解决方案 #4)?
主要区别是否在于 BCrypt 的散列机制速度慢,这使得 BCrypt 一长串常用密码既困难又昂贵?
您不能只对密码进行哈希处理,否则容易受到字典攻击;因此,您在对密码进行哈希处理之前加盐;这就是 BCrypt 所做的。
密码盐可以是public,但是每个密码都必须是唯一的。它们的目的是防止对哈希的字典攻击(因此您无法查看与密码相对应的预制哈希列表)。
和PBKDF2一样,Bcrypt是自适应函数;随着更多计算能力的出现,您可以稍后增加迭代,使散列不易受到暴力攻击。尽管如此,Bcrypt 在 GPU 上比 PBKDF2 更难加速。
我正在阅读这篇文章,BCrypt 似乎是:
- 从密码计算哈希值很慢(好事)
- 不在数据库中存储盐,而是直接在密码中存储盐
- 使用一个 log_rounds 参数来说明计算内部哈希函数的次数。
所以哈希看起来像这样:
hashed = hashpw(plaintext_password, gensalt(log_rounds=13))
print hashed
'a$ZyprE5MRw2Q3WpNOGZWGbeG7ADUre1Q8QO.uUUtcbqloU0yvzavOm'
但如果那是存储在数据库中的内容,如果数据库被黑了,我们不是仍然容易受到攻击吗? BCrypt 哈希包含盐和编码后的密码,那么为什么这比仅将盐和密码存储在数据库中更好(文章称之为糟糕的解决方案 #4)?
主要区别是否在于 BCrypt 的散列机制速度慢,这使得 BCrypt 一长串常用密码既困难又昂贵?
您不能只对密码进行哈希处理,否则容易受到字典攻击;因此,您在对密码进行哈希处理之前加盐;这就是 BCrypt 所做的。
密码盐可以是public,但是每个密码都必须是唯一的。它们的目的是防止对哈希的字典攻击(因此您无法查看与密码相对应的预制哈希列表)。
和PBKDF2一样,Bcrypt是自适应函数;随着更多计算能力的出现,您可以稍后增加迭代,使散列不易受到暴力攻击。尽管如此,Bcrypt 在 GPU 上比 PBKDF2 更难加速。