搜索数据库所需的时间

时间:2012-04-14 06:49:36

标签: database authentication time hash salt

我是Web开发和数据库的新手,我正在尝试以合理的安全性和速度实现密码身份验证。我已经读过关于散列密码并为每个用户附加一个独特的盐,以阻止人们生成彩虹表。

我的问题涉及我必须搜索以验证用户的时间。由于我不知道谁在任何给定的时间尝试连接,在我看来,我需要从盐列中检索每个字段然后散列提交的密码+每个独特的盐,然后最终比较每个输出到散列表中的字符串?

所以我必须为hash(密码+ salt)的每个组合提交一个单独的查询?这似乎非常缓慢。我错过了一个可以加快这个过程的技巧吗?或者只是吮吸它并牺牲速度以获得更好的安全性?或者我错了,而且今天的计算机的速度根本不是问题?

1 个答案:

答案 0 :(得分:1)

您无法仅根据密码对用户进行身份验证。密码是用户是他们所说的人的验证,因此您需要某种用户标识符 - 名称或其他。然后表格显示为users(..., name, password, ...),您执行SELECT password WHERE name = "foo"并从那里继续进行验证。方便的形式是保持在密码字段内生成派生密钥所需的所有参数,例如,像这样:

algo$salt$password hash

对于散列本身,你不希望它快 - 看看关键的派生函数,如PBKDF2,bcrypt或scrypt。一般来说,调整参数以便大约需要一秒钟来获得一个键是一种很好的方法,可以使暴力破坏变得不可行。