【发布时间】:2017-10-03 07:02:07
【问题描述】:
当我使用散列函数加密我的用户的密码以将它们存储在数据库中时,不是有无限数量的正确密码吗? 因为多个字符串可以产生相同的哈希值,对吧? 那这样还安全吗?
【问题讨论】:
标签: hash passwords password-protection
当我使用散列函数加密我的用户的密码以将它们存储在数据库中时,不是有无限数量的正确密码吗? 因为多个字符串可以产生相同的哈希值,对吧? 那这样还安全吗?
【问题讨论】:
标签: hash passwords password-protection
你是对的。因为散列通常比它们所代表的数据短,所以有时两个不同的输入会产生相同的散列。我们称之为哈希冲突。为了减少这种情况的机会,请选择更好的散列算法。 注意 被认为是好的散列算法的标准总是在变化,检查this S.O.发帖。
出于另一个原因,在数据库中存储普通哈希是不安全的。有使用常用散列算法的已完成散列的在线列表。因此,您可以获取其中一个列表(称为彩虹表)和数据库中的散列密码,然后通过在彩虹表中进行简单查找来计算出哪些散列对应于哪些密码。
由于许多用户会选择最常见的错误密码之一(例如 qwerty),因此这是一个大问题。解决此问题的方法称为 hash 和 salt。在散列之前,您首先在密码中添加大量随机字符串。这意味着即使是两个相同的密码也会在您的数据库中产生不同的哈希值。这更好地解释了here 和here。
一般来说,自己编写这段代码是个坏主意。尝试使用 Facebook 或 Google 等其他服务进行身份验证。他们的代码可能比单个开发人员想出的任何东西都经过更好的测试和设计。
【讨论】: