【发布时间】:2017-12-08 19:06:48
【问题描述】:
我认为关于如何在数据库中存储密码的建议存在矛盾。 我们散列密码并将其存储在数据库中,当用户尝试登录时,我们以相同的方式散列他的输入字符串并与数据库进行比较。没关系。 但是有建议通过添加随机盐来增强该哈希值。 这是问题所在: 所以我们失去了比较的全部意义,因为存储在数据库中的第一个哈希值和登录时的盐值之间的盐值会不同? 如果将盐存储在 Db 中,那么加盐有什么好处?
【问题讨论】:
-
另见 OWASP 的Secure Password Storage。 John Stevens 在创建威胁模型和设置安全控制以遏制威胁方面做得非常好。它包括加盐密码的原因。
-
“如果将盐存储在 Db 中,那么加盐有什么好处?” - 加盐可确保碰巧选择相同密码的两个用户不会在数据库中碰撞。没有它,用户可以使用他的密码来探测其他用户的密码(假设他/她有办法转储用户表)。一旦被击中,他/她就可以伪装成其他用户,因为他知道了密码。
-
@jww - 为相同的密码获取不同的哈希值只是加盐的一个小好处,实际原因是为了防止彩虹表攻击。
-
@martinstoeckli - 整个表的单一盐将提供防止预计算的保护。请参阅Secure Password Storage 详细介绍的威胁模型中的 ATTACK 1.2。
-
@jww - 这是真的,它与碰撞无关。预计算意味着你无法在知道全局盐之前计算彩虹表,但你可以构建 1 个彩虹表来获取所有密码。独特的盐完全否定了彩虹表的优势。我写了一个关于safely storing passwords的小教程,也许你有兴趣。
标签: c# hash cryptography sha password-hash