密码哈希:无限数量的正确密码?

Password-hashs: infinite amount of right passwords?

当我使用散列函数加密我的用户密码并将其存储在数据库中时,不是有无限多的正确密码吗? 因为多个字符串可以产生相同的散列,对吧? 这样还安全吗?

你是对的。因为散列通常比它们所代表的数据短,所以有时两个不同的输入会产生相同的散列。我们称之为 哈希冲突 。为减少出现这种情况的机会,请选择更好的哈希算法。 注意 好的散列算法的标准总是在变化,请查看 this S.O。 post.

出于另一个原因,将纯哈希存储在数据库中是不安全的。有使用常见散列算法完成的散列的在线列表。因此,您可以采用其中一个列表(称为彩虹 table)和数据库中的散列密码,然后通过在彩虹 table 中进行简单查找,找出哪些散列对应于哪些密码.

由于许多用户会选择最常见的错误密码之一(例如 qwerty),这是一个大问题。对此的解决方案称为 hash 和 salt。在散列之前,您首先在密码中添加一大串随机字符的位置。这意味着即使是两个相同的密码也会在您的数据库中产生不同的哈希值。这更好地解释了 here and here

一般来说,自己编写这段代码是个坏主意。尝试使用 Facebook or Google 等其他服务进行身份验证。他们的代码可能比单个开发人员所能想出的任何东西都经过更好的测试和设计。